我在桌面应用程序中工作,其中应用程序部署在Windows和Mac平台上。作为应用程序的一部分,它应该与本机层进行通信。目前,本机层和Java层之间的通信是使用套接字完成的。最近团队中的一些人建议使用zeroMQ。你们中的任何一个人都可以澄清我的怀疑。
答案 0 :(得分:1)
ZeroMQ如何比套接字更好
是否可以在桌面客户端安装中安装zeroMQ库?
是的,您需要构建库取决于处理器并将它们嵌入到您的应用程序中。
我是否需要与不同处理器的源代码分开构建它?
是的,您需要从源代码构建库。 zeroMQ以处理器为中心。
我是否仍然需要.dll文件在Java中使用zeroMQ? 是的,以下链接可以帮助您
我是否要求Visual Studio在Windows中构建zeroMQ库?
是
此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。