MOOON-agent系统设计与使用说明

易剑 2012/6/16

目录

1. 设计目标 1

2. 应用场景 2

3. 主要功能 2

4. 系统骨架 3

5. 资源接口 3

6. 内置CommandProcessor 3

7. 编程接口 3

7.1. agent.h 4

7.2. message.h 5

7.3. message_command.h 5

7.4. command_processor.h 6

8. 编程示例 7

1. 设计目标

一个通用的agent框架,提供编程接口,并内置通用的功能。

2. 应用场景

3. 主要功能

1) 自动上报心跳

2) 支持以域名方式指定center或者IP列表方式指定center

3) 与center断开后自动重连接

4) 支持多种重连接center策略,如轮询方式

5) 自动上报数据到center

6) 可选多种心跳方式,简单心跳不附带数据,富心跳可携带系统状态数据,如CPU使用率、内存使用情况等

7) 提供获取CPU使用率、内存使用情况和流量等接口

8) 内置配置等CommandProessor,常用需求不用编程直接使用

9) 非单例,单个进程可创建多个agent实例

4. 系统骨架

5. 资源接口

暂略。

6. 内置CommandProcessor

暂略。

7. 编程接口

除宏外,所以内容均位于agent名字空间内。

  1. 7.1. agent.h
  2. /***
  3. * 常量定义
  4. */
  5. enum
  6. {
  7. REPORT_MAX = 10240 /** 一次report的最大字节数 */
  8. };
  9. class IAgent
  10. {
  11. public:
  12. virtual ~IAgent() {}
  13. virtual void set_center(const std::string& domainname_or_iplist, uint16_t port) = 0;
  14. /***
  15. * 上报数据给center,report调用只是将数据存放上报队列中,由agent异步上报
  16. * @data 需要上报的数据
  17. * @data_size 需要上报的数据字节数
  18. * @timeout_millisecond 超时毫秒数,
  19. *  当队列满时,如果超时毫秒数为0,则直接返回,数据不会被放入上报队列中;
  20. *  当队列满时,如果timeout_millisecond不为0,则等待指定的时长,如果在指定的时长内,
  21. *  上报队列一直是满的,则返回,并且数据不会被放入上报队列中
  22. */
  23. virtual bool report(const char* data, size_t data_size, uint32_t timeout_millisecond=0) = 0;
  24. virtual bool report(uint32_t timeout_millisecond, const char* format, ...) = 0;
  25. virtual bool register_command_processor(ICommandProcessor* processor) = 0;
  26. virtual void deregister_command_processor(ICommandProcessor* processor) = 0;
  27. };
  28. /***
  29. * 日志器,所以分发器实例共享
  30. * 如需要记录日志,则在调用create之前,应当先设置好日志器
  31. */
  32. extern sys::ILogger* logger;
  33. /***
  34. * 用来创建agent实例,注意agent不是单例,允许一个进程内有多个实例
  35. * @queue_size 上报队列大小,如果队列满,会导致消息丢失或report调用阻塞
  36. * @connect_timeout_milliseconds 与center连接的超时毫秒数,如果在这个时间内没有数据上报,
  37. *                               则会自动发送心跳消息,否则不会发送心跳消息
  38. */
  39. extern IAgent* create(uint32_t queue_size, uint32_t connect_timeout_milliseconds);
  40. /** 销毁一个agent实例 */
  41. extern void destroy(IAgent* agent);
  42. 7.2. message.h
  43. #pragma pack(4) // 网络消息按4字节对齐
  44. /***
  45. * Agent消息头
  46. */
  47. typedef struct TAgentMessageHeader
  48. {
  49. NUInt32 size;     /** 消息包字节数 */
  50. NUInt32 command;  /** 消息的命令字 */
  51. }agent_message_header_t;
  52. /***
  53. * 简单的心跳消息,仅一个消息头
  54. */
  55. typedef struct TSimpleHeartbeatMessage
  56. {
  57. agent_message_header_t header;
  58. }simple_heartbeat_message_t;
  59. /***
  60. * 上报消息
  61. */
  62. typedef struct TReportMessage
  63. {
  64. agent_message_header_t header;
  65. char data[0]; /** 需要上报的内容 */
  66. }report_message_t;
  67. #pragma pack()
  68. 7.3. message_command.h
  69. /***
  70. * 上行消息命令字
  71. */
  72. typedef enum TUplinkMessageCommand
  73. {
  74. U_SIMPLE_HEARTBEAT_MESSAGE = 1, /** 简单心跳消息 */
  75. U_REPORT_MESSAGE           = 2  /** 上报消息 */
  76. }uplink_message_command_t;
  77. /***
  78. * 下行消息命令字,由ICommandProcessor处理
  79. */
  80. typedef enum TDownlinkMessageCommand
  81. {
  82. }downlink_message_command_t;
  83. 7.4. command_processor.h
  84. /***
  85. * 消息上下文结构
  86. * 由于是异步接收消息的,所以需要一个上下文结构来保存最新状态
  87. */
  88. typedef struct TMessageContext
  89. {
  90. size_t total_size;   /** 消息体的字节数 */
  91. size_t finished_size; /** 已经收到的消息体字节数 */
  92. TMessageContext(size_t total_size_, size_t finished_size_)
  93. :total_size(total_size_)
  94. ,finished_size(finished_size_)
  95. {
  96. }
  97. }message_context_t;
  98. class ICommandProcessor
  99. {
  100. public:
  101. virtual ~ICommandProcessor() {}
  102. /***
  103. * 返回该CommandProcessor处理的命令字
  104. */
  105. virtual uint32_t get_command() const = 0;
  106. /***
  107. * 有消息需要处理时的回调函数
  108. * 请注意消息的接收是异步的,每收到一点消息数据,都会回调on_message
  109. * 整个消息包接收完成的条件是msg_ctx.total_size和msg_ctx.finished_size+buffer_size两者相等
  110. * @buffer 当前收到的消息体数据
  111. * @buffer_size 当前收到的消息体数据字节数
  112. * @return 如果消息处理成功,则返回true,否则返回false,当返回false时,会导致连接被断开进行重连接
  113. */
  114. virtual bool on_message(const TMessageContext& msg_ctx, const char* buffer, size_t buffer_size) = 0;
  115. };
  116. 8. 编程示例
  117. // 命令字1的CommandProcessor
  118. class CCommandProcessor1: public ICommandProcessor
  119. {
  120. private:
  121. virtual uint32_t get_command() const
  122. {
  123. return 1;
  124. }
  125. virtual bool on_message(const TMessageContext& msg_ctx, const char* buffer, size_t buffer_size)
  126. {
  127. fprintf(stdout, "[%zu:%zu] %.*s\n", msg_ctx.total_size, msg_ctx.finished_size, (int)buffer_size, buffer);
  128. return true;
  129. }
  130. };
  131. // 命令字2的CommandProcessor
  132. class CCommandProcessor2: public CCommandProcessor1
  133. {
  134. private:
  135. virtual uint32_t get_command() const
  136. {
  137. return 2;
  138. }
  139. };
  140. // 命令字3的CommandProcessor
  141. class CCommandProcessor3: public CCommandProcessor1
  142. {
  143. private:
  144. virtual uint32_t get_command() const
  145. {
  146. return 3;
  147. }
  148. };
  149. class CMainHelper: public sys::IMainHelper
  150. {
  151. public:
  152. CMainHelper()
  153. :_agent(NULL)
  154. {
  155. }
  156. private:
  157. virtual bool init(int argc, char* argv[])
  158. {
  159. uint32_t queue_size = 100;
  160. uint32_t connect_timeout_milliseconds = 2000;
  161. _agent = agent::create(queue_size, connect_timeout_milliseconds);
  162. if (NULL == _agent)
  163. {
  164. return false;
  165. }
  166. _agent->register_command_processor(&_command_processor1);
  167. _agent->register_command_processor(&_command_processor2);
  168. _agent->register_command_processor(&_command_processor3);
  169. _agent->set_center(ArgsParser::center_ip->get_value(),
  170. ArgsParser::center_port->get_value());
  171. std::string report("test");
  172. while (true)
  173. {
  174. sys::CUtil::millisleep(3000);
  175. _agent->report(report.data(), report.size());
  176. }
  177. return true;
  178. }
  179. virtual void fini()
  180. {
  181. agent::destroy(_agent);
  182. _agent = NULL;
  183. }
  184. virtual int get_exit_signal() const
  185. {
  186. return SIGTERM;
  187. }
  188. private:
  189. agent::IAgent* _agent;
  190. CCommandProcessor1 _command_processor1;
  191. CCommandProcessor2 _command_processor2;
  192. CCommandProcessor3 _command_processor3;
  193. };
  194. // 入口函数
  195. extern "C" int main(int argc, char* argv[])
  196. {
  197. if (!ArgsParser::parse(argc, argv))
  198. {
  199. fprintf(stderr, "Args error: %s.\n", ArgsParser::g_error_message.c_str());
  200. exit(1);
  201. }
  202. CMainHelper main_helper;
  203. return sys::main_template(&main_helper, argc, argv);
  204. }

转载于:https://blog.51cto.com/mooon/909918

MOOON-agent系统设计与使用说明相关推荐

  1. Booking网站爬虫,获取酒店评论内容(Python)

    1.爬虫目标 booking旅游网站香港地区酒店的评论内容 2.爬虫步骤 (1)gethotelurl.py 从https://www.booking.com/reviews/hk/city/hong ...

  2. javaweb小区物业管理系统设计与实现.rar(论文+项目源码+使用说明)

    系统分析 1.1系统功能需求分析 1.1.1登录功能 登录模块两种选择登录方式,选择业主登录业主填写账号以及密码进行系统登录,登录完成后,业主可进行相应操作.选择管理员登录管理员填写账号以及密码进行系 ...

  3. 机器人实践课程镜像分享及使用说明(Arduino+ROS1+ROS2+Gazebo+SLAM+...)

    经过5年尝试和努力,在吸取indigo.kinetic版本经验后,融合Arduino.ROS1.ROS2.Gazebo和SLAM的适用机器人爱好者的实践课程镜像尝鲜版(bug是免不了的!_!)终于完成 ...

  4. 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储...

    http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...

  5. 一文看懂 K8s 日志系统设计和实践

    作者 | 元乙 阿里云存储服务技术专家 导读:上一篇文章<6 个 K8s 日志系统建设中的典型问题,你遇到过几个?>中我们介绍了为什么需要一个日志系统.为什么云原生下的日志系统如此重要以及 ...

  6. JVM插桩之二:Java agent基础原理

    Javaagent只要作用在class被加载之前对其加载,插入我们需要添加的字节码. Javaagent面向的是我们java程序员,而且agent都是用java编写的,不需要太多的c/c++编程基础, ...

  7. 面试系统设计_系统设计面试问题–您应该知道的概念

    面试系统设计 You may have heard the terms "Architecture" or "System Design." These com ...

  8. Oracle RDA(Remote Diagnostic Agent) 工具说明

    Oracle RDA(Remote Diagnostic Agent) 工具说明 分类: Oracle 性能调优 Oracle 高级知识  一.RDA 说明 RDA(RemoteDiagnostic ...

  9. mooon编译系统介绍(可复用Makefile)

    mooon编译系统介绍(可复用Makefile).pdf(ChinaUnix下载) CSDN下载:http://download.csdn.net/detail/aquester/5626929 mo ...

  10. Springboot毕设项目基于Java对运动心跳数据分析系统设计与实现455j4(java+VUE+Mybatis+Maven+Mysql)

    Springboot毕设项目基于Java对运动心跳数据分析系统设计与实现455j4(java+VUE+Mybatis+Maven+Mysql) 项目运行 环境配置: Jdk1.8 + Tomcat8. ...

最新文章

  1. g-gdb工具使用图谱(持续更新)
  2. scrollBarStyle- listview滑动条调整
  3. iptables防***自动黑白名单脚本
  4. ElementUI介绍以及安装
  5. python3 正则 去除 html标签、提取正文内容_Python通过正则表达式去除(过滤)HTML标签,提取文字...
  6. ajax中判空函数,jQuery Ajax成功函数数据为空?
  7. HBuilder工作笔记003---HBuilder 连接夜神模拟教程
  8. Hive从一个表向另一个表插入数据的注意事项
  9. CMS 系统之 iframe 结构
  10. 联网玩具CloudPets 泰迪熊泄漏数百万语音信息
  11. NIST计划对量子加密进行众测
  12. 应用程序正常初始化 0x0150002失败
  13. android蓝牙hid 鼠标,BLE HID协议-----蓝牙鼠标代码流分析
  14. 8个酷炫的GitHub技巧
  15. sdut——4541:小志志和小峰峰的日常(取石子博弈模板题 4合1)
  16. 电脑外接屏幕时“WindowsServer异常退出”
  17. 曙光服务器Raid配置
  18. HPUX的MC经典攻略
  19. 学习C语言的必要之处
  20. 【无机纳米材料科研制图——OriginLab 0205】Origin绘制BET氮气吸附/脱附曲线及孔径分布图

热门文章

  1. 建立账套时,没有选择客户分类档案
  2. centos7 安装postgresql10
  3. 2.C#2.0之泛型(完成)
  4. 关于一道面试题【字符串 '1 + (5 - 2) * 3',怎么算出结果为10,'eval'除外】
  5. 可视化操作和命令化操作
  6. 编程之美第一篇 01分数规划
  7. 【CodeVS】 p1696 奇怪的函数
  8. 发布 CodeAuto 代码生成器 2.1.0.461 中英文双语版
  9. redis-bitmap 命令使用的一些帖子
  10. springmvc json串的null值替换为空值