`
Everyday都不同
  • 浏览: 722405 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

zeromq学习笔记和解决一个相关的异常

阅读更多

关于ZeroMq(简称ZMQ)的定义、作用和强大这里就不再赘述了。总结一下它常见的几种经典模式,然后顺便提下我最近在高并发环境下使用它出现的一个异常及其解决过程吧!

 

(PS:图是盗的。。。。。)

一、REQ/REP模式



 这是最常见的请求/响应模式。服务端作为发送方,客户端作为请求方。

 

服务端:

 

ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REP);
String url = "tcp://*:9999";
socket.bind(url);
boolean wait = true;
while (wait) {
       byte[] request;
       try {
	request = socket.recv(0);
	socket.send("OK".getBytes(), 1);
} catch (ZMQException e) {
  }
}

 客户端:

ZMQ.Context context = ZMQ.context(1);
		          ZMQ.Socket socket = context.socket(ZMQ.REQ);
		  
		          System.out.println("Connecting to hello world server...");
		          socket.connect("tcp://localhost:9999");
		  
		          String requestString = "Hello" + " ";
		          byte[] request = requestString.getBytes();
		 
		          socket.send(request, ZMQ.NOBLOCK);
		         byte[] reply = socket.recv(0);
		         System.out.println("Received reply   [" + new String(reply) + "]");

 说明:服务端bind一个端口,客户端则connect一个ip地址(服务端所在的ip)和相应的端口。服务端通过context.socket(ZMQ.REP);表明是服务端,同理,客户端通过context.socket(ZMQ.REQ);表明是客户端。服务端为了持续监听,必须要把recv写在一个循环里。一般是while(true)!

 

二、PUB/SUB模式

发布/订阅模式,这种模式大家想必很熟悉,比如微博消息的推送等。



 发布方作为服务端,多个订阅方作为客户端。代码略,总结一下:

发布端bind一个端口,订阅端则connect一个ip地址(服务端所在的ip)和相应的端口。服务端通过context.socket(ZMQ.PUB);表明是发布端,同理,订阅端通过context.socket(ZMQ.SUB);表明是客户端。服务端为了持续监听,必须要把recv写在一个循环里。一般是while(true)!——这里发布方作为服务端,订阅方作为客户端。

 

三、PUSH/PULL模式



 总结:
push端bind一个端口,pull端则connect一个ip地址(push端端所在的ip)和相应的端口。push端端通过context.socket(ZMQ.PUSH);表明是push端,同理,订阅端通过context.socket(ZMQ.PULL);表明是客户端。服务端为了持续监听,必须要把recv写在一个循环里。一般是while(true)!——这里push端作为服务端,pull端作为客户端。

 

后两种模式写法类似第一种。

 

---------------------------------------

高并发下,出现的一个异常:

zmq.ZError$IOException: java.io.IOException: Unable to establish loopback connection

at zmq.Signaler.make_fdpair(Signaler.java:87)

at zmq.Signaler.<init>(Signaler.java:48)

at zmq.Mailbox.<init>(Mailbox.java:55)

at zmq.Ctx.<init>(Ctx.java:132)

 

at zmq.ZMQ.zmq_ctx_new(ZMQ.java:225)

……………………

Caused by: java.io.IOException: Unable to establish loopback connection

at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:106)

at java.security.AccessController.doPrivileged(Native Method)

at sun.nio.ch.PipeImpl.<init>(PipeImpl.java:122)

at sun.nio.ch.SelectorProviderImpl.openPipe(SelectorProviderImpl.java:27)

at java.nio.channels.Pipe.open(Pipe.java:133)

at zmq.Signaler.make_fdpair(Signaler.java:85)

... 36 more

Caused by: java.net.SocketException: No buffer space available (maximum connections reached?): bind

at sun.nio.ch.Net.bind(Native Method)

at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:124)

at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)

at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:52)

at sun.nio.ch.PipeImpl$Initializer.run(PipeImpl.java:72)

 

... 41 more

说明ZMQ的连接不够!

解决办法:发现自己的一个类,是并发情况下每笔数据都会经过的类,而我把

ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket  reg = context.socket(ZMQ.PUSH);
reg.connect("tcp://localhost:xxx");

 写在这个类的方法里,造成每次经过该类的该方法,都会创建一次context和socket,也许在并发情况还不是很明显的情况下,这个异常不会出现。但在高并发的情形下,频繁地创建ZMQ.Context和ZMQ.Socket并且再connect时,会造成很大的网络开销。故把该代码块放在static{...}类的静态代码块中——无论并发情况如何,只创建和连接一次。while循环里面有的代码,只能是send操作和recv操作!避免把ZMQ的Context,Socket的创建和connect操作放在循环里面。

 

 改完之后,压力测试48w+数据,ZMQ终于没有挂了。。

 

 

  • 大小: 9.1 KB
  • 大小: 15.2 KB
  • 大小: 17.7 KB
0
0
分享到:
评论

相关推荐

    ZeroMQ学习笔记_1234章

    它不仅仅是一个消息队列,更是一个能够构建高可用、高性能、可扩展系统的工具,对于理解和实现分布式系统来说,ZeroMQ是一份宝贵的资源。通过学习ZeroMQ,开发者可以更好地应对现代软件危机,构建能够连接全球代码的...

    消息队列zeromq学习的安装包之一libsodium

    在本安装包中,libsodium是一个关键组件,它是zeromq依赖的安全库,提供了多种加密算法和安全功能。 首先,让我们深入了解一下zeromq。zeromq设计的核心理念是简化分布式系统中的通信问题。它抽象出四种基本的消息...

    一个简单的ZeroMQ通信程序Demo

    ZeroMQ,也称为0MQ或ØMQ,是一个高性能的开源消息中间件,它提供了一种灵活的、异步的消息传递模式。在这个“一个简单的ZeroMQ通信程序Demo”中,我们将会探讨如何使用ZeroMQ实现一个基础的客户端(client)与...

    基于ZeroMQ的一对一网络类

    客户端向服务端发送一个请求(REQ),然后服务端接收到请求之后给予一个答复(REP),而我的KTV系统也是这样的,播放端请求一首新歌,点播端将播放队列的队首答复回去,或者点播端请求暂停歌曲,播放端回复暂停成功与否...

    ZeroMQ(java)window库

    ZeroMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。(摘自百度百科) ZMQ官方网址http://zeromq.org/ ZMQ本身只提供了C++版本的下载,...

    ZeroMQ-一个基于内存的消息队列

    ZeroMQ,又称为0MQ或ØMQ,是一个高度可扩展的、高性能的开源消息队列系统,它在设计上借鉴了传统的消息中间件概念,但更注重轻量级和灵活性。这个库允许开发者构建分布式应用,通过在进程间传递消息来实现异步通信...

    不错的zeromq学习资料

    6. **可扩展性**:ZeroMQ被设计成一个可伸缩层,可以在分布式系统中无缝扩展。无论是小规模的应用程序还是大型分布式系统,ZeroMQ都能够提供稳定的性能。 #### 三、ZeroMQ与RabbitMQ的对比 在多语言支持方面,...

    zeromq_java.rar_java zeromq_libzmq.lib _zeromq_zeromq java

    标题中的 "zeromq_java.rar" 暗示了这是一个关于Java与ZeroMQ结合使用的资源包。"libzmq.lib" 提及的是ZeroMQ的C库,通常用于其他语言(如Java)的绑定,以便在这些语言中使用ZeroMQ的功能。而 "zeromq_zeromq_java...

    zeromq手册源代码

    zeromq手册源代码是一个宝贵的资源,它包含了zeromq操作手册的源代码,这个手册是为开发者提供了全面的zeromq使用指南。zeromq,又称为ZeroMQ或0MQ,是一个开源的消息中间件,它实现了高性能、分布式消息传递模型,...

    zeromq-4.3.2.zip

    零MQ(ZeroMQ)是一个高度灵活且高性能的消息队列库,它被设计成可以替代传统的套接字(socket)接口。ZeroMQ的核心理念是提供一个轻量级的、分布式的消息传递模型,允许应用程序构建复杂的分布式系统。在4.3.2这个...

    ZeroMQ4.3.4

    ZeroMQ,全称为“零MQ”或“ØMQ”,是一个开源的消息中间件,它提供了一种灵活、高性能的异步消息传递机制。在标题中提到的"ZeroMQ4.3.4"是ZeroMQ的一个特定版本,4.3.4是在撰写此文本时的最新版本。这个版本包含了...

    zeromq的windows版本安装包

    “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是...

    python zeromq英文书籍

    总的来说,这本书应该为读者提供了一个全面了解ZeroMQ和Python结合使用的平台,涵盖了从基础知识到高级应用的所有必要信息,并且提供了实际操作的示例,帮助开发者通过实践掌握技术。由于是英文原著,因此还要求读者...

    ZEROmq实例

    描述提到“简单的zeromq的例子,vs下可以运行”,这暗示我们这里有一个在Visual Studio(VS)环境下编译和运行的ZeroMQ程序示例。这意味着我们将探讨如何在Windows平台下,利用C++或其他与VS兼容的语言,集成和调试...

    ZeroMQ一个强大的Socket库

    “ZMQ(以下ZeroMQ简称ZMQ)是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ的明确目标是...

    学习资料zeromq

    在学习zeromq时,要将libzmq.dll加载到文件项目中,否则无法编译

    ZeroMQ.PieterHintjens.pdf

    最后,书中提供了一个全面的索引,涵盖了ZeroMQ中使用的各种术语和概念,方便读者查找和回顾。整个书的内容是围绕ZeroMQ的核心特性和使用模式展开的,包括但不限于多语言支持、高性能和可伸缩性等。通过这本书,读者...

    ZeroMQ使用环境和结构详细分析

    这是因为ZeroMQ作为一个轻量级的库,不需要额外的服务或进程支持,因此在启动时间和资源占用方面表现更佳。此外,ZeroMQ支持多种消息模型和通信协议,使其能够灵活应对各种应用场景,而其他系统可能需要更复杂的配置...

    zeromq-3.2.5.zip

    zeromq的3.2.5版本是一个较旧但仍然广泛使用的稳定版本,它包含了C++源码和其他语言(包括C#)的绑定。 zeromq的核心概念是消息代理模式,它允许开发者创建点对点、发布/订阅和请求/响应等不同的通信模式。这些模式...

Global site tag (gtag.js) - Google Analytics