基于ZeroMQ的实时报道平台

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

 

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

 

  通讯平台作为C++分布式实时应用框架(Cpp
Distributed Real-time
Application Framework)的最主题模块,承担了分布式实时框架的基础通讯成效。通讯平台框架具备了遵照Reactor形式的网络通讯能力,并且看重于ZeroMQ库,由此辅助非持久化的message
queue的效应。基于配置文件来机关建立链接关系的意义,可以和情景为主联合配合,实现无需重启节点的动态扩容缩容等功能。强大的实时监督能力,可以实时报告每个通讯子节点的TPS和时延等紧要特性数据。管控业务经过的力量,业务经过的心跳检测,故障时自动重启、保证系统正常运转。完善的平台工具,可以因此报道平台向业务过程发送各个吩咐,如:调整日志级别,刷新业务参数,启停业务过程等等。下面将依次介绍通讯平台的功力细节。

主成分分析(Principal Component Analysis,PCA),
是一种总计办法。通过正交变换将一组或者存在相关性的变量转换为一组线性不相干的变量,转换后的这组变量叫主成分。

  一、依照部署文件自动建立通讯链接拓扑关系

  常见的分布式系统平日将经过间、节点间的各样通讯关系写死在作业代码中,这是致使代码复杂难以通晓的来由。我们改进地将有所的报道关系提取到AppInit.json配置文件中,业务代码中不再包含其他与报道连接相关的始末,使工作代码能够更在意于工作处理,而不用分心于复杂的分布式节点通讯当中。下边我们将带我们看下图所示通讯关系的配置。

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

原理:

在用总括分析方法探究多变量的课题时,变量个数太多就会追加课题的纷繁。人们当然希望变量个数较少而博得的音讯较多。在广大境况,变量之间是有早晚的连锁涉嫌的,当几个变量之间有必然相关涉嫌时,可以分解为这几个变量反映此课题的音信有肯定的交汇。主成分分析是对此原来指出的装有变量,将另行的变量(关系密不可分的变量)删去多余,建立尽可能少的新变量,使得这多少个新变量是两两不相干的,而且这一个新变量在反映课题的音信方面尽可能保持原来的音信。

举行主成分分析重点步骤如下:

  1. 目的数据标准
  2. 目标以内的相关性判定;
  3. 确定主成分个数m;
  4. 主成分Fi表达式;
  5. 主成分Fi命名;

主成分分析(principal component
analysis,PCA)是一种降维技术,把五个变量化为可知反映原始变量大部分信息的少数多少个主成分。
设X有p个变量,为n*p阶矩阵,即n个样本的p维向量。首先对X的p个变量寻找正规化线性组合,使它的方差达到最大,那些新的变量称为第一主成分,抽取第一主成分后,第二主成分的抽取方法与第一主成分相同,依次类推,直到各主成分累积方差达到总方差的一定比重。

主成分分析实例

p=princomp(USArrests,cor=TRUE)
summary(p,loadings=TRUE)

统计 2

—-Standard deviation 标准差 其平方为方差=特征值
—-Proportion of Variance 方差贡献率
—-Cumulative Proportion 方差累计进献率

screeplot(p,type="lines")

统计 3

图中的点在第几个成分的减退已经变得可怜平稳了,因此采纳前五个变量就能取得较好的音信表明,这也就表示后两个变量可以丢弃。

也可以运用loadings参数中彰显的周详值对主成分举行构建方程
y=-0.536murder-0.583assault-0.278urbanpop-0.543rape
y=0.418murder+0.188assault-0.873urbanpop-0.167rape

pre<-predict(p)
pre

统计 4

对个主成分的值举行预测的结果

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

  通讯平台支撑在线重新读取更新的部署文件,更新网络拓扑,自动建立新链接、断开旧链接的力量。配合情状为主可以实现无需重启节点的动态扩容缩容等职能。

  统计 5

  三、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

  四、通讯平台性能数据 

 统计 6

 

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

 统计 7

 性能瓶颈重要在A机,既要负责收发包,又要总计时延数据,还要控制流量。

统计, 

未完待续…

 

 技术互换合作QQ群:436466587 欢迎商讨互换