(二): 基于ZeroMQ的实时通讯平台
基于ZeroMQ的实时通讯平台
上篇:C++分布式实时应用框架 (Cpp Distributed Real-time Application Framework)----(一):整体介绍
版权声明:本文版权及所用技术归属smartguys团队所有,对于抄袭,非经同意转载等行为保留法律追究的权利!
通讯平台作为C++分布式实时应用框架(Cpp Distributed Real-time Application Framework)的最核心模块,承担了分布式实时框架的基础通讯功能。通讯平台框架具备了基于Reactor模式的网络通讯能力,并且依赖于ZeroMQ库,因此支持非持久化的message queue的功能。基于配置文件来自动建立链接关系的功能,可以和状态中心一起配合,实现无需重启节点的动态扩容缩容等功能。强大的实时监控能力,可以实时上报每个通讯子节点的TPS和时延等关键性能数据。管控业务进程的能力,业务进程的心跳检测,故障时自动重启、保证系统正常运行。完善的平台工具,可以通过通讯平台向业务进程发送各种命令,如:调整日志级别,刷新业务参数,启停业务进程等等。下面将逐一介绍通讯平台的功能细节。
一、根据配置文件自动建立通讯链接拓扑关系
常见的分布式系统通常将进程间、节点间的各种通讯关系写死在业务代码中,这是导致代码复杂难以理解的原因。我们创新地将所有的通讯关系提取到AppInit.json配置文件中,业务代码中不再包含任何与通讯连接相关的内容,使业务代码可以更专注于业务处理,而不用分心于复杂的分布式节点通讯当中。下面我们将带大家看下图所示通讯关系的配置。
OLC作为数据分发节点,给多个业务处理节点分发消息。业务处理节点内部由OCDis接收外部消息,转发给内部的OCPro业务处理进程,并负责处理完后的回包。
OLC配置部分:
"OLC" : {
"AUTO_START" : "YES",
"ENDPOINTS" : [
{ // 用于与SmartMonitor建立心跳
"name" : "MonitorSUB",
"zmq_socket_action" : "CONNECT", // ZMQ的连接模式
"zmq_socket_type" : "ZMQ_SUB" // ZMQ的通讯模式
},
{ // 下发消息给OCDis,这边存在转发功能,支持业务实现按条件转发
"downstream" : [ "OCDis2OLC"],
"name" : "NE2OLC", // 根据这个名字在业务代码中实现转发
"zmq_socket_action" : "BIND",
"zmq_socket_type" : "ZMQ_STREAM"
},
{ // OLC到OCDis的链路
"name" : "OCDis2OLC",
"statistics_on" : true,
"zmq_socket_action" : "CONNECT",
"zmq_socket_type" : "ZMQ_DEALER"
},
{ // OCDis回OLC的链路,之所以来去分开,主要用于实现优雅启停功能(启停节点保证不丢消息)
"name" : "OCDis2OLC_Backway",
"statistics_on" : true,
"zmq_socket_action" : "CONNECT",
"zmq_socket_type" : "ZMQ_DEALER",
"backway_pair" : "OCDis2OLC"
},
{ // 用于与SmartMonitor的命令消息链路
"name" : "OLC2Monitor",
"zmq_socket_action" : "CONNECT",
"zmq_socket_type" : "ZMQ_DEALER"
},
],
"ENDPOINT_TO_MONITOR" : "OLC2Monitor",
"INSTANCE_GROUP" : [
{
"instance_endpoints_address" : [
{
"endpoint_name" : "NE2OLC",
"zmq_socket_address" : "tcp://*:6701"
},
{
"endpoint_name" : "OCDis2OLC",
"zmq_socket_address" : [
"tcp://127.0.0.1:7201" // 跨机的IP地址与端口,配合状态中心可实现自动管理,无需人工参与配置
]
},
{
"endpoint_name" : "OCDis2OLC_Backway",
"zmq_socket_address" : [
"tcp://127.0.0.1:7202"
]
},
{
"endpoint_name" : "OLC2Monitor",
"zmq_socket_address" : "ipc://Monitor2Business_IPC"
},
{
"endpoint_name" : "MonitorSUB",
"zmq_socket_address" : "ipc://MonitorPUB"
}
],
"instance_group_name" : "1"
}
]
},
OLC程序:
static const char * ENDPOINT_NE2OLC = "NE2OLC";
static const char * ENDPOINT_OLC2OCDIS = "OCDis2OLC";
static const char * ENDPOINT_MONITORSUB = "MonitorSUB"; int main(int argc, char * argv[]) { SmartUtilities::Daemonize();
OLCProxyServer server(argc, argv); if (!server.Initialize(logger))
return -1;
// OLC与OCDis的消息处理
server.SetCallbackOnReceivingMessage(ENDPOINT_OLC2OCDIS, bind(&OLCProxyServer::ReceiveFromOCDis, &server, _1, _2, _3)); // OLC与SmartMonitor的消息处理
server.SetCallbackOnReceivingMessage(ENDPOINT_MONITORSUB, bind(&OLCProxyServer::ReceiveFromMonitorSUB, &server, _1, _2, _3));
// 解析消息包实现业务功能
server.SetPacketParserFunction(ENDPOINT_NE2OLC, bind(&OLCProxyServer::ParseStreamCCR, &server, _1, _2, _3));
// 设置消息转发具体规则
server.SetDownstreamSelector(ENDPOINT_NE2OLC, bind(&OLCProxyServer::StreamSelector, &server, _1, _2)); server.Run();
return 0;
}
二、在线更新链接拓扑能力
通讯平台支持在线重新读取更新的配置文件,更新网络拓扑,自动建立新链接、断开旧链接的能力。配合状态中心可以实现无需重启节点的动态扩容缩容等功能。
三、SmartMonitor进程监控管理业务进程与SmartTool工具进程
业务进程可以跟SmartMonitor建立通讯联系,SmartMonitor可以检测业务进程的心跳,以保证业务进程的可用。SmartMonitor通过AppCount.json来管理节点业务进程,实现统一启停等功能。
{
"OCPro": {
"IN": 2, // 业务进程可以有不同的种类,后面代表进程数
"PS": 3,
"SMS": 4,
},
"OCDis": 3,
"SERVER_TYPE":"OCS" // 节点的类型
}
还可以通过SmartTool工具进程,来给业务进程发送各种命令,如:调整日志级别,刷新业务参数,启停业务进程等等。
1. 启动平台
SmartMonitor
2. 停平台
SmartTool stop all
停指定进程(停止后会被SmartMonitor重新拉起)
SmartTool stop OCPro 停止所有业务的OCPro进程
SmartTool stop OCPro.IN 停止IN业务的OCPro进程
SmartTool stop 4829 停止PID为4829的进程
3. 调整应用层、框架层日志级别
其中,日志级别为error,warn,info,debug,trace
SmartTool log 进程名 level=日志级别,flush=日志级别
比如: SmartTool log OCPro level=debug,flush=debug
四、通讯平台性能数据
进程Z负载控制消息流量,进程A负责发、收消息,统计时延数据。进程B收到消息后负责回消息。
性能瓶颈主要在A机,既要负责收发包,又要统计时延数据,还要控制流量。
未完待续...
技术交流合作QQ群:436466587 欢迎讨论交流
(二): 基于ZeroMQ的实时通讯平台的更多相关文章
- 携程实时计算平台架构与实践丨DataPipeline
文 | 潘国庆 携程大数据平台实时计算平台负责人 本文主要从携程大数据平台概况.架构设计及实现.在实现当中踩坑及填坑的过程.实时计算领域详细的应用场景,以及未来规划五个方面阐述携程实时计算平台架构与实 ...
- 基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
https://www.cnblogs.com/wt645631686/p/7366924.html 前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交 ...
- PHP基于TP5使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】七.二次开发服务驱动
SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1 服务接口的作用 围绕着设备驱动模块采集的数据,根据需求提供多种应用服务,例如:数据上传服务.数 ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】二.架构和组成部分
1.1 架构结构图 1.1.1 层次示意图 1.1.2 模型对象示意图 1.2 IO管理器 IO管理器是对串口和网络通讯链路的管理.调度.针对串口和网络通讯链路的特点,在IO管 ...
- Lyft 基于 Flink 的大规模准实时数据分析平台(附FFA大会视频)
摘要:如何基于 Flink 搭建大规模准实时数据分析平台?在 Flink Forward Asia 2019 上,来自 Lyft 公司实时数据平台的徐赢博士和计算数据平台的高立博士分享了 Lyft 基 ...
- window平台基于influxdb + grafana + jmeter 搭建性能测试实时监控平台
一.influxdb 安装与配置 1.1 influxdb下载并安装 官网无需翻墙,但是下载跳出的界面需要翻墙,我这里提供下载链接:https://dl.influxdata.com/influxdb ...
- Android IOS WebRTC 音视频开发总结(六二)-- 大数据解密国外实时通讯行业开发现状
本文主要介绍国外实时通讯行业现状,文章最早发表在我们的微信公众号上,详见这里,欢迎关注微信公众号blackerteam,更多详见www.blackerteam.com 上篇文章我们采用百度搜索指数来分 ...
- 使用Websocket框架之GatewayWorker开发电商平台买家与卖家实时通讯
前段时间公司提了一个新的需求,在商品的详情页要实现站内买家和商品卖家实时通讯的功能以方便沟通促成交易,要开发此功能当时首先考虑到的就是swoole和workerman了,从网上大概了解了一下关于这两款 ...
随机推荐
- mybatis 架构
官网地址:http://code.google.com/p/mybatis/ 版本:mybatis 3.2.3 生成工具:mybatis-generator-core-1.3.2-bundle.zip ...
- 洗礼灵魂,修炼python(3)--从一个简单的print代码揭露编码问题,运行原理和语法习惯
前期工作已经准备好后,可以打开IDE编辑器了,你可以选择python自带的IDLE,也可以选择第三方的,这里我使用pycharm--一个专门为python而生的IDE 按照惯例,第一个python代码 ...
- PLSQL Developer 连接oracle(64)(instantclient_32)
下载instantclient-basic-nt-11.2.0.2.0位客户端,加压后存放,如F:\instantclient_11_2 拷贝Oracle 11.2G的msvcr80.dll和tnsn ...
- OWLQN算法
一.BFGS算法 算法思想如下: Step1 取初始点,初始正定矩阵,允许误差,令: Step2 计算: Step3 计算,使得 : Step4 令: Step5 如果,则取为 ...
- 【NOIP】OpenJudge - 15-02:财务管理
#include<stdio.h>//财务管理 int main() { ]={},sum=,ave=; ;i<=;i++) { scanf("%f",& ...
- Nginx详细安装部署教程
一.Nginx简介 Nginx是一个web服务器也可以用来做负载均衡及反向代理使用,目前使用最多的就是负载均衡,具体简介我就不介绍了百度一下有很多,下面直接进入安装步骤 二.Nginx安装 1.下载N ...
- 用html+css+js做打地鼠小游戏
html 代码 first.html <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- 【解决方案】客户端请求数据较大时,nginx返回数据被截断
[问题描述]:客户端使用curl命令向nginx请求数据,当返回数据量较大时,数据被截断,客户端无法获取完整的数据. [问题原因]:nginx配置文件中包含了proxy_buffer_size.pro ...
- Extjs6(四)——侧边栏导航根据路由跳转页面
本文基于ext-6.0.0 之前做的时候这个侧边栏导航是通过tab切换来切换页面的,但是总感觉不太对劲,现在终于发现怎么通过路由跳转了,分享给大家,可能有些不完善的地方,望大家读后可以给些指点.欢迎留 ...
- Linux系列教程(二)——Linux系统安装(手把手学安装centos6.8)
在上一篇博客我们简单的介绍了Linux系统的起源,这篇博客我们将通过图示一步一步教大家如何安装Linux系统.注意这里我们选择安装的Linux系统是其一种发行版本 CentOS,这里给大家普及一个概念 ...