zmq

大型网站架构系列:分布式消息队列(二)

人盡茶涼 提交于 2020-03-14 13:15:06
本文是大型网站架构系列:消息队列(二),主要分享JMS消息服务,常用消息中间件(Active MQ,Rabbit MQ,Zero MQ,Kafka)。【第二篇的内容大部分为网络资源的整理和汇总,供大家学习总结使用,最后有文章来源】 本次分享大纲 消息队列概述(见第一篇: 大型网站架构系列:分布式消息队列(一) ) 消息队列应用场景(见第一篇: 大型网站架构系列:分布式消息队列(一) ) 消息中间件示例(见第一篇: 大型网站架构系列:分布式消息队列(一) ) JMS消息服务 常用消息队列 参考(推荐)资料 本次分享总结 四、JMS消息服务 讲消息队列就不得不提JMS 。JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及异步性。 在EJB架构中,有消息bean可以无缝的与JM消息服务集成。在J2EE架构模式中,有消息服务者模式,用于实现消息与应用直接的解耦。 4.1消息模型 在JMS标准中,有两种消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。 4.1.1 P2P模式 P2P模式包含三个角色:消息队列(Queue),发送者(Sender),接收者(Receiver)

ZeroMQ模式

不打扰是莪最后的温柔 提交于 2020-02-17 17:37:28
文章目录 一、相关知识 二、基本套接字 1、REQ-REP模式 2、PUSH-PULL模式 3、PUB-SUB模式 4、DEALER-ROUTER模式 5、PAIR-PAIR模式 结语 一、相关知识 1、基础API接口 创建和销毁套接字:zmq_socket(), zmq_close() 配置和读取套接字选项:zmq_setsockopt(), zmq_getsockopt() 为套接字建立连接:zmq_bind(), zmq_connect() 发送和接收消息:zmq_send(), zmq_recv() 2、ZMQ与TCP的区别 使用多种协议, inproc(进程内) 、 ipc(进程间) 、 tcp 、 pgm(广播) 、 epgm ; 当客户端使用zmq_connect()时连接就已经建立了,并不要求该端点已有某个服务使用zmq_bind()进行了绑定; 连接是异步的,并由一组消息队列做缓冲; 连接会表现出某种消息模式,这是由创建连接的套接字类型决定的; 一个套接字可以有多个输入和输出连接; ZMQ没有提供类似zmq_accept()的函数,因为当套接字绑定至端点时它就自动开始接受连接了; 应用程序无法直接和这些连接打交道,因为它们是被封装在ZMQ底层的。 3、ZMQ核心消息模型 请求-应答模式:将一组服务端和一组客户端相连,用于远程过程调用或任务分发。 发布-订阅模式

zmq初次使用

僤鯓⒐⒋嵵緔 提交于 2020-01-29 00:53:34
文章目录 传统网络通信 zmq是什么 传统网络通信 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 对着这个图就很简单了: 服务端: 肯定要有一个socket然后绑定fd和ip,port,当然这时候需要转换成网络字节序,然后一堆操作,绑定完成以后就用这个fd去监听这个端口,开启listen,然后等待连接就是调用accept阻塞在这里等待连接,客户端连接后循环阻塞读写。 客户端: 先要填充好socket,然后调用connect连接服务端,也要带上ip和端口号,建立连接以后,用write和read读写,最后关闭套接字。 可以看到这种网络模型有很多问题要解决: 阻塞I/O:也就是说服务端或者客户端的读写都会阻塞,这样毫无疑问程序太死板。 多路复用:服务端要解决I/O多路复用,也就是可以处理多个客户端,比如epoll,select,poll等多路复用技术。 信号事件驱动I/O:也就是说当有I/O时采取通知机制,而不是轮询。 异步I/O:异步进行I/O操作,因为读写都会耗时,这不利于高并发的服务器开发,可以采取多线程。 而且在传统这种网络编程中,socket细节还比较复杂,并且需要自行解决分包组包,粘包,异常重连,消息缓存,消息加密,且TCP是一对一连接,就是一个socket只能有有一个连接。 那么接下来就介绍一个zmq的基本使用,它帮我们解决了这些问题。 zmq是什么

zmq笔记一: 对象关系

↘锁芯ラ 提交于 2020-01-03 02:41:28
int major, minor, patch; zmq_version(&major, &minor, &patch); //4.2.0 本文主要是分析代码,方便自己日后查阅. ========================================= 1.上下文对象以及socket对象创建 void *context = zmq_ctx_new(); //创建上下文对象 void *responder = zmq_socket(context, ZMQ_REP); //创建socket类型的对象 zmq::socket_base_t *s = ctx->create_socket (type_); int rc = zmq_bind(responder, "tcp://*:6666"); //绑定端口 一般一个进程只有一个context对象,它管理着所有socket对象. context是线程安全的,可以在多线程之间传递使用,但是socket对象不是线程安全. zmq::socket_base_t *zmq::ctx_t::create_socket (int type_) { slot_sync.lock (); if (unlikely (starting)) { starting = false; // Initialise the array of

ZMQ源代码分析(一)-- 基础数据结构的实现

拟墨画扇 提交于 2020-01-03 02:41:15
yqueue 和 ypipe zmq号称是”史上最快的消息队列”,由此可见zmq中最重要的数据结构就是队列。 zmq的队列主要由yqueue和ypipe实现。yqueue是队列的基本操作,以下首先分析yqueue的实现。 // Individual memory chunk to hold N elements. // Individual memory chunk to hold N elements. struct chunk_t { T values [N]; chunk_t *prev; chunk_t *next; }; // Back position may point to invalid memory if the queue is empty, // while begin & end positions are always valid. Begin position is // accessed exclusively be queue reader (front/pop), while back and // end positions are accessed exclusively by queue writer (back/push). chunk_t *begin_chunk; int begin_pos; chunk_t *back_chunk;

zeromq源码分析笔记之线程间收发命令(2)

时光毁灭记忆、已成空白 提交于 2020-01-03 02:40:56
在 zeromq源码分析笔记之架构 说到了zmq的整体架构,可以看到线程间通信包括两类,一类是用于收发命令,告知对象该调用什么方法去做什么事情,命令的结构由 command_t结构体确定 ;另一类是socket_base_t实例与session的消息通信,消息的结构由 msg_t确定。命令的发送与存储是通过mailbox_t实现的,消息的发送和存储是通过pipe_t实现的,这两个结构都会详细说到,今天先说一下线程间的收发命令。 zeromq的线程可分为两类,一类是io线程,像reaper_t、io_thread_t都属于这一类,这类线程的特点就是内含一个轮询器poller及mailbox_t, 通过 poller 可以 监听激活 mailbox_t的 信号 ;另一类是zmq的socket,所有socket_base_t实例化的对象都可以看做一个单独的线程,这类线程不含poller,但同样含有一个mailbox_t,可以用于收发命令,由于不含poller,只能在每次使用socket_base_t实例的时候先处理一下mailbox_t,看是否有命令需要处理,代码上来看就是每次先调用下面这个函数接收并处理一下命令: int zmq::socket_base_t::process_commands (int timeout_, bool throttle_) 另外

0MQ 事件驱动 以及 poller

孤街浪徒 提交于 2020-01-03 02:40:47
底层IO事件,以及借用socket poller的上层0MQ socket事件。 先来看用于底层和上层的两种poller。 这是用于底层io事件的poller_t,每个socket_base_t都关联到一个poller_t,这个poller_t运行在io_thread_t线程上。 这是运行在0MQ socket层的事件poller。运行在你的控制线程,也就是你编程的线程。 每次你使用zmq_poller_poll都会创建一个sokcet_poller_t去进行poll。 我们要去轮询一个0MQ socket层事件,我们会通过zmq_poll将socket_base_t添加到poller而不是底层fd。 item_t的第二个成员是pollfd,在这里设置为0,表示并不使用fd进行poll。 下面再看socket_poller_t::wait 注释写得很清楚,并不是在poll底层的fd,在poll返回后,遍历所有socket_base_t,并getsocket去取ZMQ_EVENTS事件。zmq_poll被唤醒一般是0MQ socket通过signaler_t去发送唤醒信号。 再来看socket_poller_t::rebuild(), 这是每次socket_poller_t::wait()之初都调用的。 其中它为我们需要进行zmq_poll的socket_base

ZeroMQ实例

我的未来我决定 提交于 2019-12-31 17:26:50
使用库版本 zeromq-4.0.3 接收端代码 #include <zmq.h> #include "stdio.h" int main(int argc, char * argv[]) { void * pCtx = NULL; void * pSock = NULL; const char * pAddr = "tcp://*:7766"; //创建context,zmq的socket 需要在context上进行创建 if((pCtx = zmq_ctx_new()) == NULL) { return 0; } //创建zmq socket ,socket目前有6中属性 ,这里使用dealer方式具体使用方式请参考zmq官方文档 if((pSock = zmq_socket(pCtx, ZMQ_DEALER)) == NULL) { zmq_ctx_destroy(pCtx); return 0; } int iRcvTimeout = 5000;// millsecond //设置zmq的接收超时时间为5秒 if(zmq_setsockopt(pSock, ZMQ_RCVTIMEO, &iRcvTimeout, sizeof(iRcvTimeout)) < 0) { zmq_close(pSock); zmq_ctx_destroy(pCtx); return 0; }

ZeroMQ社区宣言:Fixing the World

守給你的承諾、 提交于 2019-12-19 17:11:14
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Fixing the World How to explain ZeroMQ? Some of us start by saying all the wonderful things it does. It's sockets on steroids. It's like mailboxes with routing. It's fast! Others try to share their moment of enlightenment, that zap-pow-kaboom satori paradigm-shift moment when it all became obvious. Things just become simpler. Complexity goes away. It opens the mind. Others try to explain by comparison. It's smaller, simpler, but still looks familiar. Personally, I like to remember why we made ZeroMQ at all, because that's most likely where you, the reader,

Mac安装stf踩坑

此生再无相见时 提交于 2019-12-04 03:00:37
一. 安装stf环节,一直死循环提示: gyp WARN EACCES user "root" does not have permission to access the dev dir "/usr/local/lib/node_modules/stf/node_modules/zmq/.node-gyp/8.1.2"gyp WARN EACCES attempting to reinstall using temporary dev dir "/usr/local/lib/node_modules/stf/node_modules/zmq/.node-gyp" 解决办法: (1)sudo chmod -R 777 /var/root (2)如果上面1步骤仍然不行,可能是由于苹果SIP造成,可以按照如下进行操作: 1.重启 Mac,按住 Command+R 键直到 Apple logo 出现,进入 Recovery Mode 2.点击 Utilities > Terminal 3.在 Terminal 中输入 csrutil disable,之后回车 4.重启 Mac 二. stf doctor时提示: Error: Could not locate the bindings file. Tried:→ /usr/local/lib/node_modules/stf/node