通信平台作为C++分布式实时应用框架(Cpp澳门永利234555com,  通信平台作为C++分布式实时应用框架(Cpp

  通讯平台作为C++分布式实时应用框架(Cpp,  通讯平台作为C++分布式实时应用框架(Cpp

  基于ZeroMQ的实时报纸发表平台

  上篇:C++分布式实时应用框架 (Cpp Distributed Real-time Application
Framework)—-(一):全体介绍

 

版权注脚:本文版权及所用技术归属smartguys共青团和少先队全部,对于抄袭,非经同意转发等表现保留法律追究的权利!

 

  通信平台作为C++分布式实时应用框架(Cpp
Distributed Real-time
Application Framework)的最大旨模块,承担了分布式实时框架的基础通信作用。通信平台框架具备了遵照Reactor方式的网络通信能力,并且正视于ZeroMQ库,因而帮忙非持久化的message
queue的功效。基于配置文件来机关建立链接关系的功能,能够和情景为主一块同盟,完成无需重启节点的动态扩大容积缩容等效能。强大的实时监察能力,能够实时反映种种通信子节点的TPS和时延等首要天性数据。管理控制业务经过的力量,业务经过的心跳检查和测试,故障时自动重启、保险系统符合规律运作。完善的平台工具,可以经过电视发表平台向业务进度发送各样指令,如:调整日志级别,刷新业务参数,启停业务经过等等。上边将逐条介绍通信平台的效益细节。

  基于ZeroMQ的实时广播发表平台

  上篇:C++分布式实时应用框架 (Cpp Distributed Real-time Application
Framework)—-(一):全体介绍

 

版权注脚:本文版权及所用技术归属smartguys团队全数,对于抄袭,非经同意转发等表现保留法律追究的权利!

 

  通信平台作为C++分布式实时应用框架(Cpp
Distributed Real-time
Application Framework)的最大旨模块,承担了分布式实时框架的底子通信效用。通信平台框架具备了依据Reactor情势的互联网通信能力,并且正视于ZeroMQ库,因而补助非持久化的message
queue的效果。基于配置文件来机关建立链接关系的成效,能够和情形为主同步同盟,实现无需重启节点的动态扩大体积缩容等成效。强大的实时监督能力,能够实时报告各类通信子节点的TPS和时延等重点质量数据。管理控制工作进度的能力,业务进程的心跳检查和测试,故障时自动重启、保险系统寻常运维。完善的阳台工具,能够通过报道平台向业务经过发送各个吩咐,如:调整日志级别,刷新业务参数,启停业务经过等等。上边将相继介绍通信平台的职能细节。

  壹 、依据安插文件自动建立通信链接拓扑关系

  常见的分布式系统经常将经过间、节点间的各个通信关系写死在作业代码中,那是致使代码复杂难以精晓的来头。大家立异鸿基土地资金财产将兼具的报道关系提取到AppInit.json配置文件中,业务代码中不再包蕴别的与广播发表连接相关的内容,使工作代码能够更在意于业务处理,而不用分心于复杂的分布式节点通信当中。上面我们将带我们看下图所示通信关系的布局。

 澳门永利234555com 1

  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;
}

  壹 、根据配置文件自动建立通信链接拓扑关系

  常见的分布式系统常常将经过间、节点间的各个通信关系写死在作业代码中,那是导致代码复杂难以精晓的缘由。我们立异鸿基土地资金财产将具备的报导关系提取到AppInit.json配置文件中,业务代码中不再包括别的与报导连接相关的剧情,使工作代码能够更令人瞩目于事情处理,而不用分心于复杂的分布式节点通信当中。下边大家将带大家看下图所示通信关系的布置。

 澳门永利234555com 2

  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;
}

  贰 、在线更新链接拓扑能力

  通信平台帮助在线重新读取更新的安顿文件,更新互连网拓扑,自动建立新链接、断开旧链接的能力。合营情形为主能够兑现无需重启节点的动态扩大体量缩容等功效。

  澳门永利234555com 3

  二 、在线更新链接拓扑能力

  通信平台扶助在线重新读取更新的安插文件,更新互联网拓扑,自动建立新链接、断开旧链接的能力。同盟情状为主能够落成无需重启节点的动态扩大容积缩容等效果。

  澳门永利234555com 4

  三 、斯马特Monitor进度监察和控制管监护人务经过与斯马特Tool工具进度

  业务经过能够跟斯MattMonitor建立通信联系,斯马特Monitor可以检查和测试业务进度的心跳,以保证工作进程的可用。SmartMonitor通过AppCount.json来保管节点业务经过,达成合并启停等功能。

{
  "OCPro": {
    "IN":  2,      // 业务进程可以有不同的种类,后面代表进程数
    "PS":  3,
    "SMS": 4,
  },
  "OCDis": 3,
  "SERVER_TYPE":"OCS"  // 节点的类型
}

  还足以透过SmartTool工具进度,来给工作进度发送各个吩咐,如:调整日志级别,刷新业务参数,启停业务进程等等。

 

     1. 起步平台

      SmartMonitor

 

      2. 停平台

      SmartTool stop all

   
  停钦定进度(甘休后会被斯马特Monitor重新拉起)

      SmartTool stop OCPro
截至全部事情的OCPro进度

      SmartTool stop  OCPro.IN
停止IN业务的OCPro进程

      SmartTool stop 4829
停止PID为4829的进程

 

      3. 调整应用层、框架层日志级别

     
在那之中,日志级别为error,warn,info,debug,trace

      斯马特Tool log 进度名
level=日志级别,flush=日志级别

      比如: SmartTool log
 OCPro level=debug,flush=debug

  三 、斯马特Monitor进程监察和控制管理业务进度与SmartTool工具进度

  业务进度能够跟SmartMonitor建立通讯联系,斯马特Monitor能够检查和测试业务经过的心跳,以确认保障工作进程的可用。斯玛特Monitor通过AppCount.json来治本节点业务经过,完毕统一启停等成效。

{
  "OCPro": {
    "IN":  2,      // 业务进程可以有不同的种类,后面代表进程数
    "PS":  3,
    "SMS": 4,
  },
  "OCDis": 3,
  "SERVER_TYPE":"OCS"  // 节点的类型
}

  还足以经过斯马特Tool工具进度,来给工作进度发送各样指令,如:调整日志级别,刷新业务参数,启停业务进度等等。

 

     1. 早先平台

      SmartMonitor

 

      2. 停平台

      SmartTool stop all

   
  停钦点进度(截止后会被斯马特Monitor重新拉起)

      SmartTool stop OCPro
甘休全数事情的OCPro进程

      SmartTool stop  OCPro.IN
停止IN业务的OCPro进程

      SmartTool stop 4829
停止PID为4829的进程

 

      3. 调整应用层、框架层日志级别

     
在那之中,日志级别为error,warn,info,debug,trace

      斯马特Tool log 进度名
level=日志级别,flush=日志级别

      比如: SmartTool log
 OCPro level=debug,flush=debug

  肆 、通信平台性能数据 

 澳门永利234555com 5

 

 进程Z负载控制音信流量,进度A负责发、收音信,总计时延数据。进度B收到音信后承受回音讯。

 澳门永利234555com 6

 质量瓶颈首要在A机,既要负责收发包,又要总括时延数据,还要控制流量。

 

未完待续…

 

 技术调换同盟QQ群:436466587 欢迎研讨调换

  ④ 、通信平台品质数据 

 澳门永利234555com 7

 

 进程Z负载控制音信流量,进度A负责发、收新闻,总结时延数据。进度B收到消息后承受回新闻。

 澳门永利234555com 8

 品质瓶颈首要在A机,既要负责收签发承包合约,又要计算时延数据,还要控制流量。

 

未完待续…

 

 技术交换合营QQ群:436466587 欢迎探究交换