TT Bigdata TT Bigdata
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)

JaneTTR

数据酿造智慧,每一滴都是沉淀!
首页
  • 部署专题

    • 常规安装
    • 一键部署
  • 组件安装

    • 常规&高可用
  • 版本专题

    • 更新说明
  • Ambari-Env

    • 环境准备
    • 开始使用
  • 组件编译

    • 专区—Ambari
    • 专区—Bigtop
  • 报错解决

    • 专区—Ambari
    • 专区—Bigtop
  • 其他技巧

    • Maven镜像加速
    • Gradle镜像加速
    • Bower镜像加速
    • 虚拟环境思路
    • R环境安装+一键安装脚本
    • Ivy配置私有镜像仓库
    • Node.js 多版本共存方案
    • Ambari Web本地启动
    • Npm镜像加速
    • PostgreSQL快速安装
    • Temurin JDK 23快速安装
  • 成神之路

    • 专区—Ambari
    • 专区—Bigtop
  • 集成案例

    • Redis集成教学
    • Dolphin集成教学
    • Doris集成教学
    • 持续整理...
  • 模板代码

    • 各类组件
    • 通用模板
  • 国产化&其他系统

    • Centos系列
    • Kylin系列
    • OpenEuler系列
    • Rocky系列
    • Ubuntu系列
  • 生产调优

    • 组件调优指南
    • 1v1指导调优
  • 定制开发

    • 组件版本定制
    • 样式风格定制
  • 蓝图愿景
  • 技术支持
  • 合作共建
GitHub (opens new window)
  • 方法论

  • 代码生命周期-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样式

  • GOD-Ambari
  • 架构剖析
JaneTTR
2025-06-02
目录

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 → 所有订阅端收到
#STOMP#commandScript#Ambari#Agent#分布式消息#自动化运维
quicklinks详解[四]
server与agent协作详解[二]

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

最近更新
01
Pandoc 缺失导致 SparkR 构建失败
06-08
02
Cyrus SASL/GSASL 缺失解决
06-07
03
Hadoop_3.3.4 编译实战 1.0.0+
06-06
更多文章>
Theme by Vdoing | Copyright © 2017-2025 JaneTTR | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式