如何在桌面应用程序中使用zeroMQ

时间:2016-12-13 15:17:37

标签: java zeromq

我在桌面应用程序中工作,其中应用程序部署在Windows和Mac平台上。作为应用程序的一部分,它应该与本机层进行通信。目前,本机层和Java层之间的通信是使用套接字完成的。最近团队中的一些人建议使用zeroMQ。你们中的任何一个人都可以澄清我的怀疑。

  1. ZeroMQ如何比套接字更好
  2. 是否可以安装zeroMQ库作为桌面客户端安装的一部分
  3. 我浏览了链接'https://github.com/zeromq/clrzmq4',它给出了特定于amd64和i386处理器系列的库。我是否需要与不同处理器的源代码分开构建它?
  4. 我是否仍然需要.dll文件在Java中使用zeroMQ?
  5. 我是否要求Visual Studio在Windows中构建zeroMQ库(因为我的本机层用C#编写,我的C#应用​​程序与写入java的zeroMQ套接字套接字通信)?

2 个答案:

答案 0 :(得分:1)

  1. ZeroMQ如何比套接字更好

    http://zeromq.org/topics:omq-is-just-sockets

  2. 是否可以在桌面客户端安装中安装zeroMQ库?

    是的,您需要构建库取决于处理器并将它们嵌入到您的应用程序中。

  3. 我是否需要与不同处理器的源代码分开构建它?

    是的,您需要从源代码构建库。 zeroMQ以处理器为中心。

  4. 我是否仍然需要.dll文件在Java中使用zeroMQ? 是的,以下链接可以帮助您

    Exception in thread "main" java.lang.UnsatisfiedLinkError: ... \jzmq.dll: Can't find dependent libraries

  5. 我是否要求Visual Studio在Windows中构建zeroMQ库?

  6. link可以帮助您获得基本示例。

答案 1 :(得分:0)

关于Windows上的桌面应用程序中的ZeroMQ与同一台计算机上的另一个进程通信,请记住不支持zmq_ipc(请参阅zmq_ipc(7))。或者至少,这是我听到的最后一次。这是因为从根本上不可能像Windows中的命名管道那样实现类似select()或epoll()的任何东西。只需使用zmq_tcp。

同样的基本问题困扰着Cygwin及其衍生物中select()实现的开发。他们通过为每个选择的非套接字文件描述符(即命名管道,串行端口等)启动一个线程来解决问题,每个线程轮询HANDLE以查看是否有任何数据到达(或者在select中设置了什么事件) ())。不是很有效率。 Yeurk。

Proactor vs Reactor

Windows是proactor(只能做proactor),其他一切(* nix,VxWorks)都是reactor(也可以用来实现一个proactor)。用于C ++的boost.asio库的开发受此影响,并且因此可以在Windows上运行,因此它是一个proactor设计。 RabbitMQ也是proactor。

使用zmq_poll()的ZeroMQ是reactor。

Proactor - 您主动启动异步例程来处理将来发生的任何事情。

Reactor - 你通过启动同步调用到你想要处理的任何例程,你知道它会很快完成,因为数据已经存在,你对任何事件的到来作出反应。

差异很关键。在一个proactor设计中,一旦你启动了异步例程来阅读一条消息,你就不能(轻松地)阻止或改变它直到它完成它的事情。如果你改变主意,例如由于从其他地方阅读一些消息,那就非常烦人。

小警告 - Windows确实支持网络套接字的select()(因此可以使用网络套接字进行反应器编程,但只能使用网络套接字),这也是ZMQ在Windows上受到任何支持的唯一原因。

将ZMQ与桌面应用程序事件回调混合

无论如何,proactor意味着Windows和C#从根本上要求所有内容都由回调服务。这基本上意味着如果您还有处理GUI事件的回调,您将无法使用zmq_poll()调用来告诉您新消息是否已到达。相反,您最有可能对zmq_revcmsg()进行异步调用。试图将zmq_poll()与回调混合是一件麻烦事(你要混合使用proactor和reactor)。

邮件格式

ZeroMQ和套接字都传输字节(作为带有ZeroMQ的离散消息,作为带有套接字的字节流)。人们仍然面临着决定字节对应用程序意味着什么的挑战。

我可以推荐使用像Google协议缓冲区之类的东西来序列化消息,以供ZeroMQ传输。它可用于C#和Java,但它没有划分消息边界。幸运的是,ZeroMQ确实如此。 [在套接字流上使用GPB可能很痛苦,您必须自己划分消息边界]。因此,您可以将消息序列化到缓冲区,将缓冲区作为消息传递给ZeroMQ,接收方接收消息并绝对确定内部存在一个单独的GPB。如果你愿意,你可以使用GPB" oneof"跨越任意消息类型,这可能是非常自由的。当然,您也可以使用其他序列化技术完成相同的工作,我个人最喜欢的是ASN.1。