(二): 基于ZeroMQ的实时报道平台

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

  常见的分布式系统通常用经过中、节点内的各种通讯关系写深于事情代码中,这是导致代码复杂难以明白的故。我们创新地将兼具的报导关系提取到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;
}

假设达到图所示,我于gradle中上加了如此同样段落代码

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

搭下光需要一点点候时,你就得成功并了该jar包了。

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

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

  

img3.png

  基于ZeroMQ的实时报道平台

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

 

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

 

  通讯平台作为C++分布式实时应用框架(Cpp
Distributed Real-time
Application Framework)的尽中心模块,承担了分布式实时框架的基础通讯功能。通讯平台框架具备了基于Reactor模式的网络通讯能力,并且依赖让ZeroMQ库,因此支持非持久化的message
queue的法力。基于配置文件来机关建立链接关系的效用,可以同状态为主一块配合,实现无需再次开节点的动态扩容缩容等力量。强大的实时监察能力,可以实时反馈每个通讯子节点的TPS和时延等关键性能数据。管控业务经过的力量,业务经过的胸臆跳检测,故障时自动还开、保证系统正常运行。完善的阳台工具,可以经报道平台为业务过程发送各种吩咐,如:调整日志级别,刷新业务参数,启停业务经过等等。下面用逐条介绍通讯平台的职能细节。

累加对应之堆栈底地点后,你还待

  四、通讯平台性数据 

 

 

 进程Z负载控制消息流量,进程A负责发、收消息,统计时延数据。进程B收到信后担当转消息。

 

 性能瓶颈主要在A机,既使各负其责收发包,又要统计时延数据,还要控制流量。

 

未完待续…

 

 技术交流合作QQ群:436466587 欢迎讨论交流

以相应的compile信息上加进去

导入Jar包

img6.png

安卓付出过程遭到必不可少的会下到各国种.so库,AndroidStudio中导入.so是用展开安排的,如图,我于libs的同级目录下新建了一个文件夹名为JNILibs,导入了自我需要使用的各级种.so

AndroidStudio是当下安卓开发中当之无愧的神器,但是不少初拟的同班对于与Eclipse完全无均等的AS是充满怨念的。于是作者开了是主题,一点一点拉动你运动符合AS神器之门。

其后,我们还待以gradle中展开部署

开拓上图两单公文后文件称分别吗app和而的工程名称

  • 导入jar包,添加在线第三正在依,导入.so文件
  • 导入Module/Library项目
  • Android Studio
    使用小技巧及快捷键
  • 插件(作弊器)
  • APK压缩,混淆

咱选Project视图

YTOUY5G`IIFYQQWWGW@CDZ8.png

1473350042725.jpg

点击后据悉你的纱状态与电脑配置情况会以大势所趋时间里完成,当AS提示而成功时,你便都会以代码中动用该第三正在所提供的整套功能了。

无独有偶创建好之项目要齐图所示,左侧是种管理,右侧是代码编辑窗口,在2.1.3底本子中,点击箭头图标选择Project

当此作者提前创建好了一个AS项目,使用的AS版本号是2.1.3

导入PhotoView发生点儿个东西要开展配备,repositoriesdependencies,该配置需要在片个gradle葡京在线开户文件中好,两单gradle文件与配置好图如下

AndroidStudio的极度强大之一就是是在线依赖功能,这里我们错过github上寻找一个老三方,示例使用PhotoView,我们可以于github地址上特别懂地观看

在线依赖

img7.png

img2.png

AndroidStudio之导入第三在

双重按下右侧上比的Sync,稍等一会,恭喜您,你已打响做到了.so库的导入工作。
顶此地而都基本控制了AndroidStudio中的各种导入功能,在以后更新的章中,还见面称到另外的一些导入,谢谢。

img4.png

SO库的增长

sourceSets { main { jniLibs.srcDirs = ['JNILibs'] } }

img1.png

1473349593627.jpg

img5.png

ps:
作者是第一差写这么的稿子,很多不足的地方还望大家指出,接受一切批评,还为各位不吝指教!

1473350132162.jpg

Project视图大概是这么的,我们可生直白地看见libs文件夹,接下去将你而导入的jar包拖入libs文件夹内,再以下图操作