zoukankan      html  css  js  c++  java
  • 一个网络传输框架——zeroMQ 调研笔记

    一、它是什么

    zeroMQ,一个处理消息传输的库,重点在传输上,看起来它像是在socket上面封装了一层,让我们可以很容易的利用它来做N对M的数据传输,在分布式系统中很方便,在接收端它有round-robin负载均衡。

    官方介绍:http://zguide.zeromq.org/page:all

    "ZeroMQ (also known as ØMQ, 0MQ, or zmq) looks like an embeddable networking library but acts like a concurrency framework. It gives you sockets that carry atomic messages across various transports like in-process, inter-process, TCP, and multicast. You can connect sockets N-to-N with patterns like fan-out, pub-sub, task distribution, and request-reply. It's fast enough to be the fabric for clustered products. Its asynchronous I/O model gives you scalable multicore applications, built as asynchronous message-processing tasks. It has a score of language APIs and runs on most operating systems. ZeroMQ is from iMatix and is LGPLv3 open source."

    二、使用场景

    有人用zeroMQ替换Kafka,稳定性的到了提升:
    ‘While improved stability and reliability was the key motivation for this transition, the added performance and reduced system complexity were a nice side effects. In the few days since we replaced Kafka with ZeroMQ the quality of my sleep has improved substantially. — Tomasz Janczuk, Auth0’
    从利用多核的角度介绍zeroMQ的必要性(主要是说在多核场景下的程序设计,程序设计者需要把工作拆分成各个可以并发执行的任务,各个隔离的节点在各自独立的完成任务,它们通过消息队列协作):
    The key is to pass information as messages rather than shared state.
    使用消息来解决并发时的数据通信,比使用共享状态要强得多。
     

    云风对zeroMQ的介绍:http://blog.codingnow.com/2011/02/zeromq_message_patterns.html
    “在需要并行化处理数据的时候,采用消息队列通讯的方式来协作,比采用共享状态的方式要好的多。”
    所以zeroMQ的主要用途是:分布式系统的消息通信工具。

    官方详细介绍:http://zguide.zeromq.org/page:all
    zeroMQ中的zero,表示的是极简。
    “其实ZMQ可以做的还不止这些,它会颠覆人们编写网络应用程序的模式。虽然从表面上看,它不过是提供了一套处理套接字的API,能够用zmq_recv()和zmq_send()进行消息的收发,但是,消息处理将成为应用程序的核心部分,很快你的程序就会变成一个个消息处理模块,这既美观又自然。它的扩展性还很强,每项任务由一个节点(节点是一个线程)、同一台机器上的两个节点(节点是一个进程)、同一网络上的两台机器(节点是一台机器)来处理,而不需要改动应用程序。”

    这点说的很好,但这种设计思路,其实早就有了,chromium里的多线程设计,便是把后台程序拆分成一个个task,post到工作线程中完成,然后再post回来,单机的多线程利用思路跟zeroMQ为并行计算而设计的思路有相似的地方,chromium对多线程使用的这种设计也不是首创的。“一个个的消息处理模块”,在我当前工作的团队中,整个服务过亿网民的框架也是这么设计的,不过,消息的传递没有使用zeroMQ,而是自己公司的rpc框架。

    三、代码

    注意:基于Node.js框架

    zmq的socket模式: req、rep、push、pull、pub、sub、router、dealer

    1、请求和应答
    req和rep也就是请求回应模型,req和rep都可以请求和回答,不同的只是req是先send再rec,rep是先rec再send。支持N个请求端一个接收端,也支持N个接收端一个请求端。N个接收端采用rr负载均衡。 哪个是“一”端,哪个就bind端口,“N”端就只能connect,所以,req+rep无论谁bind端口,肯定要有一个是“一”。
    router和dealer就是随时可以发送和接收的req和rep,看起来router+dealer跟 req+rep属于同类功能。
    因为router和dealer可以随时发送接收,所以它们可以用来做路由。
    一个router用来响应N个req,然后它在响应处理的时候,再通过另一个socket把请求扔出去,接收者是另外的M个rep,这就做到N:M。
    2、订阅和推送
    pub和sub就是发布者和订阅者。
    3、推和拉
    push和pull就是管道,一个只推数据,一个只拉数据。
     
    看起来比较轻松的demo代码,所有的socket模式都有:https://github.com/JustinTulloss/zeromq.node/tree/master/examples
    req-->router1+router2-->rep 模式的示例代码:https://github.com/imatix/zguide/blob/master/examples/Node.js/lbbroker.js
     
    本文所在:http://www.cnblogs.com/cswuyg/p/5196587.html
  • 相关阅读:
    分享下在小程序中怎么做循环
    微信程序开发语法
    微信小程序底部导航栏(tabbar)
    vue 跨域 和django跨域
    Pytest中如何解决测试用例的依赖执行问题
    python远程连接linux
    python+selenium之XPATH定位
    linux模拟弱网延迟和丢包
    django配置mysql数据库
    django项目引入bootstrap
  • 原文地址:https://www.cnblogs.com/cswuyg/p/5196587.html
Copyright © 2011-2022 走看看