标签: zeromq

你知道任何使用ZeroMQ的项目吗?成功和失败的故事都是有价值的

我有兴趣在一个项目中使用ZeroMQ,但我想听听其他人使用它的经验.我做了一些搜索,但发现只有mongrel2项目.您是否听说过其他使用它的项目?哪些公司在生产中使用ZeroMQ?

use-case zeromq

19
推荐指数
1
解决办法
4133
查看次数

zeromq如何与SSL协同工作?

我认为在我的应用程序之间使用zeromq作为消息传递层.至少在某些情况下,我希望通信是安全的,我正在考虑SSL.

是否有一些标准方法如何启用ssl-enable zeromq?据我所知,它不支持开箱即用.

如果我在连接到套接字时只有一个参数(bool:useSsl):)会很好

有任何想法吗?

sockets ssl zeromq

18
推荐指数
3
解决办法
1万
查看次数

为什么操作系统会限制文件描述符?

在我尽力研究实现消息队列服务器的最佳方法后,我问了这个问题.为什么操作系统会限制进程和全局系统可以拥有的打开文件描述符的数量?我当前的服务器实现使用zeromq,并为每个连接的websocket客户端打开一个订阅者套接字.显然,单个进程只能将客户端处理到fds的极限.当我研究这个主题时,我发现了很多关于如何将系统限制提高到高达64k fds的信息,但它从未提到它如何影响系统性能以及为什么它开始时为1k或更低?我目前的方法是尝试使用自己的循环中的协程向所有客户端发送消息,以及所有客户端及其订阅通道的映射.但我只是想听听关于文件描述符限制以及它们如何影响试图在每个客户端级别使用持久连接的应用程序的可靠答案?

operating-system file-descriptor message-queue zeromq websocket

18
推荐指数
1
解决办法
3755
查看次数

棘轮PHP WAMP - React/ZeroMQ - 特定用户广播

注意:这是一样的这个问题,它利用MessageComponentInterface.我正在使用WampServerInterface,所以这个问题具体涉及那个部分.我需要一个代码示例和解释的答案,因为我可以看到这对将来的其他人有帮助.

试图为个人用户提供循环推送

我正在使用Ratchet和ZeroMQ的WAMP部分,我目前有推送集成教程的工作版本.

我正在尝试执行以下操作:

  • zeromq服务器已启动并正在运行,准备记录订阅者和取消订阅者
  • 用户通过websocket协议在他们的浏览器中连接
  • 一个循环开始将数据发送给特定的用户谁要求它
  • 当用户断开连接时,将停止该用户数据的循环

我有点(1)和(2)工作,但我遇到的问题是第三个:

首先:如何仅向每个特定用户发送数据?广播将它发送给每个人,除非"主题"最终可能是个人用户ID?

其次:我有一个很大的安全问题.如果我发送哪个用户ID想要从客户端订阅,这似乎是我需要的,那么用户可以将变量更改为另一个用户的ID,而是返回他们的数据.

第三:我必须运行一个单独的php脚本,其中包含zeromq的代码以启动实际的循环.我不确定这是最好的方法,我宁愿让它完全在代码库中工作,而不是单独的php文件.这是我需要排序的主要领域.

以下代码显示了我目前拥有的内容.

刚从控制台运行的服务器

我按字面输入php bin/push-server.php来运行它.订阅和取消订阅将输出到此终端以进行调试.

$loop   = React\EventLoop\Factory::create();
$pusher = Pusher;

$context = new React\ZMQ\Context($loop);
$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind('tcp://127.0.0.1:5555');
$pull->on('message', array($pusher, 'onMessage'));

$webSock = new React\Socket\Server($loop);
$webSock->listen(8080, '0.0.0.0'); // Binding to 0.0.0.0 means remotes can connect
$webServer = new Ratchet\Server\IoServer(
    new Ratchet\WebSocket\WsServer(
        new Ratchet\Wamp\WampServer(
            $pusher
        ) …
Run Code Online (Sandbox Code Playgroud)

php zeromq websocket ratchet reactphp

18
推荐指数
1
解决办法
9103
查看次数

为什么/何时使用DDS代替ZeroMQ?

我读了以下内容:

  1. DDS与AMQP对比ZeroMQ
  2. http://mnb.ociweb.com/mnb/MiddlewareNewsBrief-201004.html

似乎没有使用DDS代替zmq的功能:

  1. zmq的延迟更好.
  2. 在我看来,ZMQ的API清晰而简单.
  3. 我不能使用ZMQ来在线程/进程/站之间传输数据.

所以:

  1. 什么时候使用DDS更好?
  2. 与ZMQ相比,DDS 有更好的表现吗?
  3. 是否有使用DDS(而不是ZMQ)的明确目的

谢谢

ipc zeromq data-distribution-service

18
推荐指数
1
解决办法
6894
查看次数

我使用反应性香蕉吗?

这是一个使用反应香蕉库的Haskell FRP程序示例.我只是刚刚开始尝试使用Haskell,特别是对于FRP的含义并不是很清楚.我真的很感激对下面代码的批评

{-# LANGUAGE DeriveDataTypeable #-}
module Main where

{-
Example FRP/zeromq app.

The idea is that messages come into a zeromq socket in the form "id state". The state is of each id is tracked until it's complete.
-}

import Control.Monad
import Data.ByteString.Char8 as C (unpack)
import Data.Map as M
import Data.Maybe
import Reactive.Banana
import System.Environment (getArgs)
import System.ZMQ

data Msg = Msg {mid :: String, state :: String}
    deriving (Show, Typeable)

type IdMap = Map String String

-- …
Run Code Online (Sandbox Code Playgroud)

haskell zeromq frp reactive-programming reactive-banana

17
推荐指数
1
解决办法
2220
查看次数

如何使用Zeromq的inproc和ipc传输?

我是ZERMQ的新手.ZeroMQ具有TCP,INPROC和IPC传输.我正在寻找在Winx64和python 2.7中使用python和inproc的例子,它们也可以用于linux.

此外,我一直在寻找UDP传输方法,但无法找到示例.

我发现的唯一例子是

import zmq
import zhelpers

context = zmq.Context()

sink = context.socket(zmq.ROUTER)
sink.bind("inproc://example")

# First allow 0MQ to set the identity
anonymous = context.socket(zmq.XREQ)
anonymous.connect("inproc://example")
anonymous.send("XREP uses a generated UUID")
zhelpers.dump(sink)

# Then set the identity ourself
identified = context.socket(zmq.XREQ)
identified.setsockopt(zmq.IDENTITY, "Hello")
identified.connect("inproc://example")
identified.send("XREP socket uses REQ's socket identity")
zhelpers.dump(sink)
Run Code Online (Sandbox Code Playgroud)

我正在考虑的用例是:UDP就像分发信息一样.使用TCP测试推/拉更快或者更快.

这是测试示例> ..............

服务器:

import zmq
import time

context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("inproc://example2")

while True:
    #  Wait for next request from client
    message = socket.recv()
    print …
Run Code Online (Sandbox Code Playgroud)

python ipc zeromq inproc

17
推荐指数
3
解决办法
3万
查看次数

zeroMQ上下文背后的理由是什么?

讨论zeroMQ(对于那些不知道的人来说是一个非常有用的套接字替换)时,我在邮件列表中遇到了这个问题:

使用多个上下文:使用多个上下文有不利之处吗?

使用多个上下文有不利之处吗?我有一个类包装器,我想尽可能简单.我可以修改它以允许在单个上下文下的多个连接,套接字等,或者保持原样并让包装器的客户端多次实例化它.

我看到它有两个缺点.

  1. 捆绑资源没有好的效果(额外的内存占用,另一个I/O线程等)
  2. 在不同上下文中创建的套接字无法使用"inproc"传输进行相互通信.'inproc'这个名字有点用词不当; 它真的意味着"内部文本".

CR

回顾我的和其他各种源代码,我最终意识到上下文设置代码:

void *context = zmq_init (1); //creates the context 

void *responder = zmq_socket (context, ZMQ_REP); //creates the socket

zmq_bind (responder, "tcp://*:5555"); //and binds it

... //Do whatever you want with the socket ...

zmq_close (responder); //destructors
zmq_term (context);
Run Code Online (Sandbox Code Playgroud)

可以有效地替换为:

void *context = zmq_init(1); //saving the context is optional

responder = zmq_socket(type); //creates the socket
//additional [context] can be provided if desired (multi-context?)

zmq_bind (responder, "tcp://*:5555"); //and binds it …
Run Code Online (Sandbox Code Playgroud)

language-agnostic zeromq

17
推荐指数
1
解决办法
6585
查看次数

对于水平扩展的分布式系统,Redis Cluster vs Pub/Sub中的ZeroMQ

如果我要设计一个庞大的分布式系统,其吞吐量应与用户数量和系统中的通道数量成线性关系,这会更好吗?

1)Redis Cluster(仅适用于Redis 3.0 alpha,如果它处于群集模式,您可以在一个节点中发布并在另一个完全不同的节点中订阅,并且消息将传播并与您联系).Publish的复杂性是O(N + M),其中N是订阅客户端的数量,M是系统中订阅模式的数量,但是在Redis群集中它如何扩展?我接受有关这方面的有根据的猜测.

2)自3.x以来的ZeroMQ,它进行服务器端过滤,因此它也有一些时间复杂度,但我在文档中没有看到任何关于它的内容.如果我想扩展它,我可以让很多服务器发布到任何通道,每个订户将连接到所有服务器,并订阅所需的通道.这看起来不错.

那么哪一个更适合大型发布者系统的横向扩展?我应该研究哪些其他解决方案?请记住,我希望最小化延迟和吞吐量,但能够水平扩展.

publish subscription publish-subscribe zeromq redis

17
推荐指数
1
解决办法
7797
查看次数

Node.js socket.send()函数在退出之前无法完成

在我编写的一些Node.js脚本中,我注意到即使最后一行是同步调用,有时它也会在Node.js退出之前完成.

我从未见过一个console.log语句在退出之前无法运行/完成,但我看到其他一些语句在退出之前未能完成,我相信它们都是同步的.我可以理解为什么在这种情况下异步函数的回调当然无法触发.

有问题的代码是ZeroMQ .send()调用,如下所示:

   var zmq = require('zmq');
   var pub = zmq.socket('pub');

   pub.bindSync('tcp://127.0.0.1:5555');   

    setInterval(function(){
        pub.send('polyglot');
    },500);
Run Code Online (Sandbox Code Playgroud)

上面的代码按预期工作...但如果我删除setInterval()并只是这样调用它:

   var zmq = require('zmq');
   var pub = zmq.socket('pub');

    pub.bindSync('tcp://127.0.0.1:5555');

    pub.send('polyglot');  //this message does not get delivered before exit
    process.exit(0);
Run Code Online (Sandbox Code Playgroud)

...然后消息将无法传递 - 程序将在pub.send()呼叫完成之前退出.

在Node.js中退出之前确保语句完成的最佳方法是什么?关机挂钩可以在这里工作,但我担心这只会掩盖问题,因为你不能把所有你需要的东西确保在关机钩子中运行.

这个问题也可以通过这种方式证明:

 if (typeof messageHandler[nameOfHandlerFunction] == 'function') {
          reply.send('Success');
          messageHandler[nameOfHandlerFunction](null, args);
         } else {
         reply.send('Failure'); //***this call might not complete before the error is thrown below.***
         throw new Error('SmartConnect error: no handler for ZMQ …
Run Code Online (Sandbox Code Playgroud)

javascript zeromq node.js

17
推荐指数
1
解决办法
661
查看次数