TT Bigdata TT Bigdata
首页
GitHub (opens new window)
JaneTTR

JaneTTR

数据酿造智慧,每一滴都是沉淀!
  • Ambari 深度专题

  • Bigtop 方法论

  • 自定义集成

  • Ambari Server 与 Web

    • 方法论

    • 代码生命周期-metainfo

    • 架构剖析

      • server与agent协作详解[一]
        • 1. 引言与问题概述 🎯
          • 1.1 背景介绍
          • 1.2 目标
        • 2. 核心概念解析 🧠
          • 2.1 STOMP 协议基础
          • 2.1.1 什么是 STOMP?
          • 2.1.2 消息结构
          • 2.2 快速 STOMP Demo 实践
          • 2.2.1 场景与目标
          • 2.2.2 服务端实现(Spring Boot版)
          • 2.2.3 客户端实现(HTML+JS)
          • 2.2.4 一键运行体验
          • 2.2.5 消息流转全景
      • server与agent协作详解[二]
      • ambari install逻辑详解[一]
      • ambari install逻辑详解[二]
      • ambari install逻辑详解[三]
      • stack-hooks逻辑详解[一]
      • stack-hooks逻辑详解[二]
      • distro-select逻辑详解
      • java 请求过程解读[一]
      • java 请求过程解读[二]
      • java 请求过程解读[三]
      • java 请求过程泛化及补充[一]
      • java 请求过程泛化及补充[二]
    • UI样式

  • Ambari Metrics

  • Ambari Plus 思考

  • Redis集成实战

  • 通用代码模板

  • 各组件代码

  • 技术专题
  • Ambari Server 与 Web
  • 架构剖析
JaneTTR
2025-06-02
目录
1. 引言与问题概述 🎯
1.1 背景介绍
1.2 目标
2. 核心概念解析 🧠
2.1 STOMP 协议基础
2.1.1 什么是 STOMP?
2.1.2 消息结构
2.2 快速 STOMP Demo 实践
2.2.1 场景与目标
2.2.2 服务端实现(Spring Boot版)
2.2.3 客户端实现(HTML+JS)
2.2.4 一键运行体验
2.2.5 消息流转全景

server与agent协作详解[一]

# 1. 引言与问题概述 🎯

# 1.1 背景介绍

在前面的章节中,我们已经详细剖析了 commandScript 在 Ambari 服务管理中的作用,涵盖了其在服务启动、停止、健康检查等流程中的定义、绑定与生命周期机制。然而,对于实际生产环境下的大部分用户而言, 仅理解 commandScript 的写法与基本调用还远远不够。

当你在 Ambari Web UI 上点击某个操作(比如服务安装或 SERVICE_CHECK)时,后端其实经历了一连串复杂但自动化的分布式指令流转——Server 是如何生成并下发任务的?这些任务又是如何被各个 Agent 精准接收、解析并落地执行的? 核心机制 答案就是:Ambari 内部依赖 STOMP 协议实现 Server-Agent 的可靠异步通信,这套消息机制正是连接 commandScript 定义与实际命令落地的“数据总线”。

本章将以 commandScript 的触发链路为主线,全面解读 Ambari 从 UI 操作到 Server 指令下发、再到 Agent 脚本执行的完整过程,重点剖析 STOMP 协议在消息分发与执行闭环中的核心实现。 同时,我们还会补充回顾 commandScript 的配置与触发方式,通过实际代码和消息流向,帮助你彻底弄清 **Ambari 分布式运维的“消息流”底层逻辑 **。


# 1.2 目标

本节目标分为两点:

  1. 深入解读 STOMP 协议的通信过程 详细说明 STOMP 如何实现 Ambari Server 与 Agent 之间的消息传递,并揭示 commandScript 的实际触发链路。

  2. 剖析从 UI 点击到脚本执行的全链路细节 还原用户操作、Server 任务分发、Agent 指令落地的每一个环节,串联起一个完整的自动化运维闭环。


# 2. 核心概念解析 🧠

# 2.1 STOMP 协议基础

# 2.1.1 什么是 STOMP?

STOMP(Simple/Streaming Text-Oriented Messaging Protocol)是一种轻量级、基于文本的消息协议。 它被广泛用于各种消息中间件(如 RabbitMQ、ActiveMQ 等),也是 Ambari Server 与 Agent 之间消息分发的“官方通信协议”。

STOMP 的优点包括:

  • 简单易用 纯文本格式,易于调试和学习,便于快速集成。
  • 支持订阅/发布 支持 Topic/Queue 等多种分发模型,适合广播和点对点业务场景。
  • 跨语言 丰富的客户端生态,Java、Python、JS 等主流语言均有支持。
  • 结构化扩展 消息由命令、头部和正文组成,扩展性极强。

# 2.1.2 消息结构

STOMP 消息由三部分组成:

部分 说明 示例
命令 消息动作类型 SEND, SUBSCRIBE 等
头部 元数据/路由信息 destination:/topic/test
正文 消息体(数据内容) Hello, STOMP!

典型 STOMP 消息:

SEND
destination:/topic/test
content-type:text/plain

Hello, STOMP!
\0
1
2
3
4
5
6

# 2.2 快速 STOMP Demo 实践

# 2.2.1 场景与目标

我们先通过一个最小可运行的 STOMP 实例,快速理解其基本用法和通信流程:

  • 客户端订阅某个主题(Topic)
  • 客户端向主题发送消息
  • 服务端收到消息并广播给所有订阅者

# 2.2.2 服务端实现(Spring Boot版)

实践步骤一

1. 配置 WebSocket 和消息代理:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic"); // 启用内存消息代理
        registry.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/websocket").withSockJS(); // 注册 STOMP 端点
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

2. 消息处理 Controller:

@Controller
public class MessageController {
    @MessageMapping("/sendMessage")
    @SendTo("/topic/messages")
    public String handleMessage(String message) {
        System.out.println("服务端接收到消息: " + message);
        return "广播消息: " + message;
    }
}
1
2
3
4
5
6
7
8
9

# 2.2.3 客户端实现(HTML+JS)

实践步骤二

前端只需一份简单的 HTML + JS,即可订阅/发送消息,完整打通 STOMP 通道:

<!DOCTYPE html>
<html>
<head>
    <title>STOMP Demo</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.5.2/sockjs.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
</head>
<body>
<h1>STOMP Demo</h1>
<div>
    <input type="text" id="message" placeholder="输入消息"/>
    <button onclick="sendMessage()">发送消息</button>
</div>
<div id="messages"></div>
<script>
    let stompClient;

    function connect() {
        const socket = new SockJS('/websocket');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            stompClient.subscribe('/topic/messages', function (response) {
                showMessage(response.body);
            });
        });
    }

    function showMessage(message) {
        const messagesDiv = document.getElementById('messages');
        const messageElement = document.createElement('div');
        messageElement.textContent = message;
        messagesDiv.appendChild(messageElement);
    }

    function sendMessage() {
        const message = document.getElementById('message').value;
        stompClient.send('/app/sendMessage', {}, message);
    }

    connect();
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

# 2.2.4 一键运行体验

操作说明
  • 启动 Spring Boot 服务端
  • 浏览器打开 index.html
  • 输入消息,点击“发送”,实时看到所有订阅者同步收到消息

控制台与页面示例输出:

广播消息: 你好,STOMP!
服务端接收到消息: 你好,STOMP!
1
2

# 2.2.5 消息流转全景

  • 服务端注册 STOMP 端点,支持 WebSocket 连接和消息主题广播
  • 客户端使用 SockJS+STOMP 协议,既可订阅消息,也可推送消息
  • 消息流转链路: 客户端 SEND → 服务端接收处理 → 广播到 /topic/messages → 所有订阅端收到
#Ambari#源码解析#metainfo#自动化部署
versionAdvertised详解
server与agent协作详解[二]

← versionAdvertised详解 server与agent协作详解[二]→

最近更新
01
当前版本 2026/08
08-29
02
把 Ambari Server HA 稳稳地跑起来
08-17
03
从一次启用操作追到主备就绪
08-17
更多文章>
Theme by Vdoing | Copyright © 2017-2026 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式