Tag: zeromq

伯克利WinRTsockets外观networking合理性?

这是我发送到ZeroMQ邮件列表的post的副本。 然而,这个问题并不是ZeroMQ所特有的,而是更一般地说,在WinRT中提供的networkingfunction上需要一个“映射”层,以便在针对WinRT编译时为C ++代码提供更加正常的“伯克利套接字外观”: 大家好,我以前在iPhone和Android版本的移动应用程序(见http://www.ibuzzedfirst.com )中使用了ZeroMQ,因为这些平台支持native / C ++ / Socket开发,因此也支持ZeroMQ。 对于WindowsPhone 7.5(OS 7.1)版本,由于WinPhone 7.5只支持C#,而不是C ++(它实际上是一个C#Silverlight应用程序),所以我必须重新实现所有必需的ZeroMQfunction。 此外,WinPhone 7.5只提供它自己的“版本”的套接字支持( http://msdn.microsoft.com/en-us/library/sb27wehh%28v=vs.95%29.aspx ),它只支持asynchronous版本的function,例如ConnectAsync,SendAync,ReceiveAsync等。但是,C ++的缺乏使得这个问题变得不切实际。 因此,对于WindowsPhone 7.5版本,我只将应用程序限制为“客户端”(参赛者)function,并没有实现“服务器”(测验主控)部分。 这是因为应用程序的客户端部分只发送和接收请求,回复和订阅服务器,而服务器利用了固有的multithreading多用户function的ZeroMQ。 为客户端重新创buildZeroMQ传输协议/头是(相对)简单的,并使用WindowsPhone套接字支持来提供通信。 好吧,现在我正在考虑将应用程序移植到Windows 8上的WinRT。(桌面/平板电脑版本首先 – Windows Phone 8 RT SDK还没有出来,但将是类似的)。 好消息是WinRT支持C ++,耶! (实际上,编写C#时只是WinRT应用程序,可以编译为'AnyCPU',只要包含C ++部分,就必须构build3个不同的版本 – x86 / Win32,x64和ARM版本,但这是一个不同的问题)。 不幸的是,像Windows 7/8 Phone一样,WinRT不支持“正常的”伯克利套接字访问,而是提供它自己的“编程版本”的Socket编程,为不同的套接字场景提供离散类,例如连接TCP客户端的StreamSocket( http ://msdn.microsoft.com/en-us/library/windows/apps/windows.networking.sockets.streamsocket.aspx#methods ),可绑定的TCP服务器的StreamSocketListener( http://msdn.microsoft.com/zh-cn/ -us / library / windows / apps / […]

ZeroMQ推/拉模式的用处

在试用ZeroMQ Push/Pull (他们称为Pipeline )套接字types时,我很难理解这种模式的效用。 它被称为“负载平衡器”。 如果一个服务器向多个工作人员发送任务,推/拉将在所有客户端之间平均分配任务。 3个客户端和30个任务,每个客户端获得10个任务:客户端1获取任务1,4,7,…客户端2,2,5,…等等。 很公平。 从字面上看。 但是,实际上,任务复杂性或客户端计算资源(或可用性)往往是非均匀混合的,那么这种模式就会严重破坏。 所有的任务似乎都是预先安排好的,服务器不知道客户的进展情况,甚至是否可用。 如果client1发生故障,其剩余任务不会发送到其他客户端,而是保持排队等待client1。 如果client1保持closures状态,那么这些任务不会被处理。 相反,如果一个客户在处理任务时更快,那么他就没有得到更多的任务,并保持闲置状态,因为他们仍然为其他客户安排。 使用REQ/REP是一种可能的解决scheme; 任务然后只被赋予一个可用的资源。 所以我错过了什么? Push/Pull如何有效使用? 有没有办法处理这种套接字types的客户端,任务等的不对称? 谢谢! 以下是一个简单的Python示例: # server import zmq import time context = zmq.Context() socket = context.socket(zmq.PUSH) #socket = context.socket(zmq.REP) # uncomment for Req/Rep socket.bind("tcp://127.0.0.1:5555") i = 0 time.sleep(1) # naive wait for clients to arrive while True: #msg […]

在zeroMq中pub-sub和push-pull模式之间的差异

这两个图像来自http://zguide.zeromq.org/page:all 。 这两种模式之间的区别是什么,如果我们忽略推挽模式中的汇点? 消息如何传递有什么不同,如果是的话有什么不同?

从信号处理程序中调用OCaml包装的ZeroMQ代码

我已经根据http://www.linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php上的指南为CZMQ写了一些OCaml绑定,这似乎工作得很好。 例如这里是zstr_send: CAMLprim value caml_zstr_send(value socket_val, value string_val) { CAMLparam2 (socket_val, string_val); void *sock = CAML_CZMQ_zsocket_val(socket_val); char *string = String_val(string_val); int rc = zstr_send(sock, string); CAMLreturn (Val_int(rc)); } 我可以在我的大部分代码中使用这些绑定来发送和接收消息。 不过,我有一个场景,我希望做一个信号处理程序的内部发送和接收,在其他代码的背景做消息传递的结尾。 以这个简化的例子: open ZMQ exception SocketBindFailure let bg_ctx = zctx_new ();; let pub_sock = zsocket_new bg_ctx ZMQ_PUB;; let handler _ = print_endline "enter handler"; print_endline (string_of_int […]

什么是zeromq用例?

你能写一些zeromq的例子吗?

使用Socket.IO + Node.js + ZMQ发送消息时发生内存泄漏

我有三个应用程序互相交谈。 Websocket服务器(1)接受来自浏览器的连接,parsingurl以查看需要什么数据,如果它有内存中的数据则将其提供给客户端,如果不从另一个名为“fetcher”的应用程序请求它(2)。 Fetcher接收到这个作业,从一个简单的API(3)请求它返回JSON数据,并将其发送回websocker服务器,并将其发布到连接的客户端。 然后“Fetcher”开始定期检查是否有更新到该URL /作业,并发送新的数据到websocket服务器。 我使用socket.io进行client-websocket服务器通信。 Websocket服务器和fetcher通过ZMQ套接字进行通信 。 我用130个连接加载testingwebsocket服务器。 Websocket服务器每秒向130个客户端发布160KB的数据。 一开始,它为130个连接使用了170MB的内存,但是很快就增加到了1GB,尽pipe没有新的连接。 然后socket.io的心跳信号开始失败,导致连接丢失。 我使用Nodetime来获取堆快照。 在第130个客户端连接之后,下面是内存的外观: 共有44MB的 缓冲区对象 。 在四分钟内,Buffer对象的数量急剧增加(再次没有新的连接):其中有3012个,总内存为486MB 。 再过10分钟后,总共有3535个内存消耗总量为573MB 。 我用Mozilla的memwatch找出哪行增加了内存,发现是这个函数: function notifyObservers(resourceId) { var data = resourceData[resourceId]; io.sockets.in(resourceId).emit('data', data); } 如果我注释这些行,内存使用保持不变,这是另一个确认。 任何想法如何发生? 我在ZMQ的订阅者套接字方法里面调用了这个函数,我怀疑它和这个有关系。如果我删除了函数并将它们合并成一个, // Receive new resource data const resourceUpdatedSubscriber = zmq.socket('sub').connect('tcp://localhost:5433'); resourceUpdatedSubscriber.subscribe(''); resourceUpdatedSubscriber.on('message', function (data) { var resource = JSON.parse(data); resourceData[resource.id] = […]

ZeroMQ与十字路口I / O

我正在研究使用ZeroMQ作为一个相当大的分布式系统的消息/传输层,主要针对监视和数据收集(许多生产者,一些消费者)。 据我所见,目前有两种不同的相同概念的实现; ZeroMQ和Crossroads I / O,后者是ZeroMQ的一个分支(2012年?)。 我试图找出哪一个使用,并想知道他们之间的差异,但至今没有find关于这方面的许多信息。 例如: 它们在电线上是否兼容? 他们是API兼容的,即某种常见的基础API,可能有不同的附加组件? 他们是否都实现了对ZMTP(ZeroMQ消息传输协议)的支持? 他们对未来的发展有一些共同的理解,还是会继续两个不同的方向? 与其他方面有什么优点/缺点? 基本上,如何select一个呢?

为什么zeromq不能在localhost上运行?

这段代码很好用: import zmq, json, time def main(): context = zmq.Context() subscriber = context.socket(zmq.SUB) subscriber.bind("ipc://test") subscriber.setsockopt(zmq.SUBSCRIBE, '') while True: print subscriber.recv() def main(): context = zmq.Context() publisher = context.socket(zmq.PUB) publisher.connect("ipc://test") while True: publisher.send( "hello world" ) time.sleep( 1 ) 但是这个代码不工作: import zmq, json, time def recv(): context = zmq.Context() subscriber = context.socket(zmq.SUB) subscriber.bind("tcp://localhost:5555") subscriber.setsockopt(zmq.SUBSCRIBE, '') while […]

zeromq:如何防止无限等待?

我刚刚开始使用ZMQ。 我正在devise一个应用程序的工作stream程是: 许多客户之一(具有随机PULL地址)在5555向服务器推送请求 服务器永远在等待客户端PUSHes。 当有人来的时候,这个特定的请求会产生一个工作进程。 是的,工作进程可以同时存在。 当这个过程完成它的任务时,它将结果压入客户端。 我认为PUSH / PULL体系结构适合于此。 请纠正我这一点。 但是,我如何处理这些情况呢? 当服务器无法响应时,client_receiver.recv()将等待无限的时间。 客户端可能会发送请求,但之后会立即失败,因此工作进程将永远停留在server_sender.send()。 那么如何在PUSH / PULL模型中设置类似于超时的东西呢? 编辑 :感谢user938949的build议,我得到了一个工作的答案 ,我分享了后代。

ZeroMQ,RabbitMQ和Apache Qpid的性能比较

我需要为我的应用程序提供高性能的消息总线,所以我正在评估ZeroMQ , RabbitMQ和Apache Qpid 。 为了衡量性能,我正在运行一个testing程序,该程序使用消息队列实现之一发布10,000条消息,并在同一台计算机上运行另一个进程来消费这10,000条消息。 然后logging发布的第一封邮件和收到的最后一封邮件的时差。 以下是我用于比较的设置。 RabbitMQ :我使用了“扇出”types的交换和一个默认configuration的队列。 我使用了RabbitMQ C客户端库。 ZeroMQ :我的发布者使用ZMQ_PUSH套接字发布到tcp://localhost:port1 ,我的代理在tcp://localhost:port1上侦听,然后将消息重新发送到tcp:// localhost:port2,我的使用者在tcp://localhost:port2上侦听tcp://localhost:port2使用ZMQ_PULL套接字。 我在ZeroMQ使用一个代理而不是点对点通信的代理来使性能比较对使用代理的其他消息队列实现公平。 Qpid C ++消息代理:我使用了“扇出”types的交换和一个默认configuration的队列。 我使用了Qpid C ++客户端库。 以下是性能结果: RabbitMQ :收到10,000条消息需要大约1秒的时间。 ZeroMQ :接收10,000条消息需要大约15毫秒的时间。 Qpid :接收10,000条消息需要大约4秒的时间。 问题: 有没有人在消息队列之间运行类似的性能比较? 然后我喜欢将我的结果与你的结果进行比较。 有什么办法可以调整RabbitMQ或Qpid使其性能更好? 注意: testing是在两台分配的处理器的虚拟机上完成的。 结果可能因硬件而异,但我主要关注MQ产品的相对性能。