在需要并行化处理数据的时候,采用消息队列通讯的方式来协作,比采用共享状态的方式要好的多。Erlang ,Go 都使用这一手段来让并行任务之间协同工作。

最近读完了 ZeroMQ 的 Guide。写的很不错。前几年一直有做类似的工作,但是自己总结的不好。而 ZeroMQ 把消息通讯方面的模式总结的很不错。

ZeroMQ 并不是一个对 socket 的封装,不能用它去实现已有的网络协议。它有自己的模式,不同于更底层的点对点通讯模式。它有比 tcp 协议更高一级的协议。(当然 ZeroMQ 不一定基于 TCP 协议,它也可以用于进程间和进程内通讯。)它改变了通讯都基于一对一的连接这个假设。

ZeroMQ 把通讯的需求看成四类。其中一类是一对一结对通讯,用来支持传统的 TCP socket 模型,但并不推荐使用。常用的通讯模式只有三类。

  1. 请求回应模型。由请求端发起请求,并等待回应端回应请求。从请求端来看,一定是一对对收发配对的;反之,在回应端一定是发收对。请求端和回应端都可以是 1:N 的模型。通常把 1 认为是 server ,N 认为是 Client 。ZeroMQ 可以很好的支持路由功能(实现路由功能的组件叫作 Device),把 1:N 扩展为 N:M (只需要加入若干路由节点)。从这个模型看,更底层的端点地址是对上层隐藏的。每个请求都隐含有回应地址,而应用则不关心它。

  2. 发布订阅模型。这个模型里,发布端是单向只发送数据的,且不关心是否把全部的信息都发送给订阅端。如果发布端开始发布信息的时候,订阅端尚未连接上来,这些信息直接丢弃。不过一旦订阅端连接上来,中间会保证没有信息丢失。同样,订阅端则只负责接收,而不能反馈。如果发布端和订阅端需要交互(比如要确认订阅者是否已经连接上),则使用额外的 socket 采用请求回应模型满足这个需求。

  3. 管道模型。这个模型里,管道是单向的,从 PUSH 端单向的向 PULL 端单向的推送数据流。

任何分布式,并行的需求,都可以用这三种模型组合起来解决问题。ZeroMQ 只专注和解决了消息通讯这一基本问题,干的非常漂亮。

基于定义好的模型,我们可以看到,api 可以实现的非常简单易用。我们不再需要 bind/listen/accept 来架设服务器,因为这个模型天然是 1:N 而不是 1:1 的,不需要为每个通道保留一个句柄。我们也不必在意 server 是否先启动(bind),而后才能让 client 工作起来(connect)。

这以上模型中,关注的是通讯双方的职责,而不是实现的方式:监听端口还是连接对方端口。对于复杂的多进程协同工作的系统, 不必纠结于进程启动的次序(在我前几年设计的系统中,启动脚本写起来就非常麻烦)。

使用 ZeroMQ 不必在意底层实现是使用短连接还是长连接方式。ZeroMQ 中的 Transient (短暂) 和 Durable (持久) socket 也并非区别于实现层是否保持了 tcp 连接。而是概念上的不同。对于 Durable socket ,其生命期可以长于一个进程的生命期,即使进程退出,再次启动后依旧可以维持继续之前的 socket 。当然,这并不是帮助你挽救你的程序因出错而崩溃的。它只是提出这个模式,让你根据设计需要可以实现。对于 ZeroMQ ,如有需求(若内存有限),甚至把数据传输的 buffer 放到磁盘上。


对于网络游戏,我觉得基于 ZeroMQ 来架构服务器非常合适。对于玩家 Client - Server 部分倒不必使用 ZeroMQ ,而可以写一个前端程序,比如前些年写过的一篇 blog 中提到的连接服务器依然适用。这个连接服务器对内的服务集群则可以用 ZeroMQ 的协议通讯。

[zz]ZeroMQ 的模式相关推荐

  1. Ubuntu 20.04安装、显卡驱动配置及搜狗输入法配置(U盘离线安装、vi编辑器,esc ZZ,tty3模式)(一)

    小白装Ubuntu20.04-系列记录(一) 目录 小白装Ubuntu20.04-系列记录(一) Ubuntu 20.04安装 显卡驱动配置(U盘离线安装.vi编辑器,esc ZZ,tty3模式) 搜 ...

  2. (转)ZeroMQ的模式-Requset-Reply

    2019独角兽企业重金招聘Python工程师标准>>> 我们先来看看第一种模式:Request-Reply Pattern. 请求应答模式. Request-Reply这个名字很直白 ...

  3. Python使用ZeroMQ/inproc模式实现多线程服务端

    第4届全国高校大数据与人工智能教学研讨会(厦门大学) 2021年全国高校Python程序设计课程高级研修班通知 中国大学MOOC"Python程序设计基础"免费学习地址 2020年 ...

  4. 传输层的各种模式——ZeroMQ 库的使用 .

    最近在研究 ZeroMQ 库的使用,所以在这里总结一下各种模式,以便日后拿来使用. 关于 ZeroMQ 库,我就不多介绍了,大家可以参考下面一些文章,以及他的官网.使用指南.API 参考.项目仓库等内 ...

  5. 消息队列(MQ):ZeroMQ基本原理

    目录 1 ZeroMQ概述 2 ZeroMQ工作模式 2.1 请求-应答 2.2 发布-订阅 2.3 并行管道 3 参考 1 ZeroMQ概述        ZeroMQ看起来想一个可嵌入的网络库,但 ...

  6. [ linux ] vim 编辑器的三种模式介绍

    之前写道了Linux的防火墙相关的操作,我就想到了我们常用的编辑器vim,在这里也一起分享一下 目录 linux编辑器简介: Linux平台下的文本编辑器: vi和vim区别: 使用vim工具打开文件 ...

  7. 【linux + lighttpd + php + zeromq】之实战训练二

    三.实践 2. zeromq mdp(Majordomo Protocol)模式测试 说明: 1) zeromq mdp模式大家可以到zeromq官网的guide自己学习,不在此处赘述. 不过mdp模 ...

  8. linux系统vim程序编译器,Linux学习:vim程序编辑器

    本次记录vim这款文本编辑器的使用方法及它有哪些使用实例等. 基本概念 在Linux环境中,配置文件对整个系统来说具有举足轻重的作用,而对于其都是以ASCII的纯文本形式存在,而利用文本编辑器就能够达 ...

  9. vi php,linux编辑文件命令vi有什么作用

    vi命令用于进入UNIX操作系统中最通用的全屏幕纯文本编辑器vi.vi编辑器支持编辑模式和命令模式,编辑模式下可以完成文本的编辑功能,命令模式下可以完成对文件的操作命令,要正确使用vi编辑器就必须熟练 ...

最新文章

  1. python getostime_python中sys,os,time模块的使用(包括时间格式的各种转换)
  2. R语言ggplot2可视化时间序列数据并突出标注重要时间点数据实战:特殊节点标签标注、特殊区域标注
  3. 在线设计 html5 表单,html5注册表单制作-表单制作-小程序表单制作
  4. Spring框架版本命名规则
  5. ubuntu修改服务器端口,服务器环境之4:ubuntu14.04安装tomcat,端口修改
  6. [Tip: bat] About %~dp0
  7. Struts2结果页面配置(Result)
  8. 小白设计模式:策略模式
  9. 从0开始写JavaWeb框架系列(1)从0开始写SamrtFrameWork:读取配置文件
  10. MySQL常用命令集锦
  11. 计算机网络协议名词解析,网络协议名词解释
  12. 【干货】如何紧跟未来的设计趋势:15 个让你永远不过时的资源
  13. LeetCode题解(1682):最长回文子序列II(Python)
  14. Jenkins流水线部署java项目
  15. 东京奥组委公布奥运志愿者和城市志愿者昵称
  16. 【Ubuntu】[待机时间]:修改Ubuntu待机时间
  17. 地图飞线图 echart+高德地图实现
  18. 计算机专业考研面试题大全———持续更新中
  19. Vue 使用图表插件 -- Echarts
  20. 用Python爬取王者农药英雄皮肤 原

热门文章

  1. RSocket:又一个REST的挑战者
  2. 光剑免费图书馆 Free Ebooks
  3. [转]Android NDK几点回调方式
  4. 转: 理解AngularJS中的依赖注入
  5. Android系统如何管理自己内存的?
  6. .net 2.0 BackgroundWorker类详细用法
  7. 安装yarn 心得分享
  8. Kafka不停机,如何无感知迁移ZooKeeper集群?
  9. [UWP]了解模板化控件(7):支持Command
  10. 为博客园添加github跳转链接