CN105005469B - 一种基于Zookeeper和RabbitMQ的非阻塞调用方法 - Google Patents
一种基于Zookeeper和RabbitMQ的非阻塞调用方法 Download PDFInfo
- Publication number
- CN105005469B CN105005469B CN201510299990.8A CN201510299990A CN105005469B CN 105005469 B CN105005469 B CN 105005469B CN 201510299990 A CN201510299990 A CN 201510299990A CN 105005469 B CN105005469 B CN 105005469B
- Authority
- CN
- China
- Prior art keywords
- caller
- zookeeper
- zxid
- callid
- message
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 32
- 230000005540 biological transmission Effects 0.000 claims description 3
- 235000013399 edible fruits Nutrition 0.000 claims 1
- 230000009286 beneficial effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000000977 initiatory effect Effects 0.000 description 1
Landscapes
- Telephonic Communication Services (AREA)
Abstract
本发明提供一种基于Zookeeper和RabbitMQ的非阻塞的远程过程调用方法,包括如下步骤:在Zookeeper文件***中为调用者编号;调用者创建消息并向RabbitMQ队列发送;调用者创建文件节点并监听;被调用者解析判断能否独立完成;向调用者写入结果,Zookeeper***通知结果。本发明的调用方法为一种非阻塞的调用方法,调用者或者被调用者都不需要阻塞等待调用时间或者等待反馈结果,极大提高了远程调用过程中的效率,减少了***资源的消耗。
Description
技术领域
本发明属于分布式服务领域,具体涉及到一种非阻塞的远程调用解决方案。
背景技术
Zookeeper是一种分布式树形文件***,我们可以在Zookeeper文件***中创建文件节点,并监听改改节点的内容变化。
RabbitMQ是一种分布式消息队列,通过一台RabbitMQ服务器,消息发送者不需要了解消息接受者的地址,而只需要知道RabbitMQ的服务器地址即可以发送消息,通过RabbitMQ的消息路由机制,消息接受者可以准确地接收到消息发送者的消息。
远程过程调用的本质是过程调用,过程调用只能实现同一个进程内部的调用,而远程过程调用利用网络,将调用者和被调用者之间分离,调用者甚至不知道被调用者是谁,通过Webservice或者是RPC的方式,透明地实现函数调用的过程,远程过程调用大部分是一种阻塞式的操作,即调用者在发送调用请求以后,会阻塞等待被调用者将结果返回。被调用者也会在被调用请求完成以后,立即将调用结果返回给被调用者。
传统远程过程调用方法中,调用者在发起调用请求,一般是通过WebService、RPC等方式,这种方法的缺点:
1、在调用者在调用完成以后,调用者需要阻塞等待调用的结果。
2、如果调用的方法涉及到分布式操作,那么被调用者也会被阻塞,直到得到分布式操作的结果然后才能返回结果。
3、调用者和被调用者在高频率的远程过程调用过程中效率不高,阻塞往往会消耗***资源,被调用者如果也需要远程过程调用时,整个过程调用需要消耗的***资源更多。
发明内容
本发明所要解决的技术问题是提供一种基于Zookeeper和RabbitMQ的非阻塞的远程过程调用方法,能解决背景技术中存在的问题。
本发明解决上述技术问题所采用的技术方案是:
一种基于Zookeeper和RabbitMQ的非阻塞调用方法,包括如下步骤:
(1)在Zookeeper文件***中为每一个调用者编号callid并创建相应的目录节点;
(2)每次远程过程调用时,编号为callid的调用者创建一个包含消息内容和zxid编号的消息,向RabbitMQ队列发送这个消息;
(3)编号为callid的调用者在Zookeeper文件***中相应的目录下创建一个以zxid编号命名的文件节点并监听这个文件节点的变化;
(4)被调用者在收到消息以后,解析得出消息内容、zxid编号和调用者编号callid,并判断该消息的处理能否独立完成,是进行步骤(5),否进行步骤(6);
(5)完成消息任务后,向Zookeeper文件***中调用者callid目录下的zxid编号写入结果,Zookeeper***通知调用者结果。
(6)被调用者生成一个包含该zxid编号和新的callid编号的分布式请求并发送,然后以类似步骤(3)的方式创建并监听Zookeeper文件***中的zxid文件节点,等待结果;有了结果之后如步骤(5)中一样唤醒调用者。
(7)当调用者被Zookeeper唤醒,从Zookeeper文件***中,得到结果以后,便将zxid编号的文件节点删除。
在采用上述技术方案的同时,本发明还可以采用或者组合采用以下进一步的技术方案:
步骤(2)中,每一个调用者都有一个独立自增的zxid编号和Zookeeper文件***中该调用者的编号callid,用来区别不同调用者和调用次数。
步骤(7)中,如果调用者还需要将结果返回给上一个调用者,那么该调用者还需要将最终结果写入到上一个调用者目录下的zxid文件节点中。
本发明的有益效果是:本发明的调用方法为一种非阻塞的调用方法,调用者或者被调用者都不需要阻塞等待调用时间或者等待反馈结果,极大提高了远程调用过程中的效率,减少了***资源的消耗。
附图说明
图1本发明的流程图。
图2本发明中Zookeeper文件***的节点树形图。
具体实施方式
为了更为具体地描述本发明,下面结合具体实施例来对本发明方法及其***进行详细说明。
基于Zookeeper和RabbitMQ的非阻塞调用方法,包括如下步骤:
步骤1、服务器A,B,C在Zookeeper服务器中注册。文件节点分别为/server/0,/server/1,/server/2。A,B,C服务器分别获取自己的服务器编号依次为0,1,2。然后进入步骤2。
步骤2、服务器A向服务器B发送远程调用请求requestA,首先将请求包装到一个Java对象Request:
class Request{
Unsigned intzxid,
Unsigned intcallid,
Unsigned intlastcallid,
Byte[]messages
}
这个对象中包含请求编号zxid,以及调用者编号callid和消息内容messages。然后调用RabbitMQ客户端的发送命令,将消息发送给RabbitMQ服务器,由RabbitMQ服务器将消息路由给服务器B。然后创建一个Zookeeper***监听Zookeeper文件***中/server/0/1节点是否有变化。接着服务器A就可以去接受新的请求了,不用等待服务器B的响应消息,然后进入步骤3。
3、服务器B在接收到requestA时,解析这个请求得出zxid为1和callId为0。表示这是编号为0的服务器A发来的第一个请求。服务器B解析这个消息以后,首先需要获取服务器C上面的数据,然后根据本地数据计算出最终结果以返回给服务器A。服务器B则创建一个新的请求RequestB使用相同的zxid也就是1,callid设置为1(服务器B的编号),发送出去,然后监听Zookeeper文件***中的/server/1/1节点。然后进入步骤4。
4、服务器C在接受到服务器B的消息后,将结果写入到/server/1/1节点。这一操作会唤醒服务器B,然后服务器B完成未完成的任务,将最终结果写入到/server/0/1中。然后进入步骤5。
5、服务器A被Zookeeper服务器唤醒,得到最终答案。
Claims (3)
1.一种基于Zookeeper和RabbitMQ的非阻塞调用方法,包括如下步骤:
(1)在Zookeeper文件***中为每一个调用者编号callid并创建相应的目录节点;
(2)每次远程过程调用时,编号为callid的调用者创建一个包含消息内容和zxid编号的消息,向RabbitMQ队列发送这个消息;
(3)编号为callid的调用者在Zookeeper文件***中相应的目录下创建一个以zxid编号命名的文件节点并监听这个文件节点的变化;
(4)被调用者在收到消息以后,解析得出消息内容、zxid编号和调用者编号callid,并判断该消息的处理能否独立完成,是进行步骤(5),否进行步骤(6);
(5)完成消息任务后,向Zookeeper文件***中调用者callid目录下的zxid编号写入结果,Zookeeper***通知调用者结果;
(6)被调用者生成一个包含该zxid编号和新的callid编号的分布式请求并发送,然后以类似步骤(3)的方式创建并监听Zookeeper文件***中的zxid文件节点,等待结果;并根据结果确定是否唤醒调用者;
(7)当调用者被Zookeeper唤醒,从Zookeeper文件***中,得到结果以后,便将zxid编号的文件节点删除。
2.根据权利要求书1所述的非阻塞调用方法,其特征在于:步骤(2)中,每一个调用者都有一个独立自增的zxid编号和Zookeeper文件***中该调用者的编号callid,用来区别不同调用者和调用次数。
3.如权利要求1所述的非阻塞调用方法,其特征在于:步骤(7)中,如果调用者还需要将结果返回给上一个调用者,那么该调用者还需要将最终结果写入到上一个调用者目录下的zxid文件节点中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510299990.8A CN105005469B (zh) | 2015-06-03 | 2015-06-03 | 一种基于Zookeeper和RabbitMQ的非阻塞调用方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510299990.8A CN105005469B (zh) | 2015-06-03 | 2015-06-03 | 一种基于Zookeeper和RabbitMQ的非阻塞调用方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN105005469A CN105005469A (zh) | 2015-10-28 |
CN105005469B true CN105005469B (zh) | 2018-04-13 |
Family
ID=54378150
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510299990.8A Active CN105005469B (zh) | 2015-06-03 | 2015-06-03 | 一种基于Zookeeper和RabbitMQ的非阻塞调用方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN105005469B (zh) |
Families Citing this family (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107423122B (zh) * | 2017-07-25 | 2020-08-18 | 苏州博纳讯动软件有限公司 | 一种复杂运维作业编排与调度***及其方法 |
CN108347445B (zh) * | 2018-03-19 | 2021-04-27 | 武汉斗鱼网络科技有限公司 | 实现远程调用的方法及装置 |
CN110489216B (zh) * | 2019-07-05 | 2021-12-07 | 苏州浪潮智能科技有限公司 | 利用Windows API调用解除RabbitMQ-C库阻塞的方法和*** |
CN111221662B (zh) * | 2019-10-16 | 2021-01-05 | 贝壳找房(北京)科技有限公司 | 任务调度方法、***及装置 |
CN112783672B (zh) * | 2021-01-27 | 2024-04-05 | 传神语联网网络科技股份有限公司 | 一种远程过程调用处理方法及*** |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102710554A (zh) * | 2012-06-25 | 2012-10-03 | 深圳中兴网信科技有限公司 | 分布式消息***和分布式消息***的服务状态检测方法 |
CN103501237A (zh) * | 2013-09-03 | 2014-01-08 | 小米科技有限责任公司 | 设备管理方法、管理平台、设备及*** |
CN103731312A (zh) * | 2014-01-26 | 2014-04-16 | 飞狐信息技术(天津)有限公司 | 对远程方法调用的服务进行故障检查的方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100490390C (zh) * | 2006-01-10 | 2009-05-20 | 华为技术有限公司 | 业务故障恢复方法 |
-
2015
- 2015-06-03 CN CN201510299990.8A patent/CN105005469B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102710554A (zh) * | 2012-06-25 | 2012-10-03 | 深圳中兴网信科技有限公司 | 分布式消息***和分布式消息***的服务状态检测方法 |
CN103501237A (zh) * | 2013-09-03 | 2014-01-08 | 小米科技有限责任公司 | 设备管理方法、管理平台、设备及*** |
CN103731312A (zh) * | 2014-01-26 | 2014-04-16 | 飞狐信息技术(天津)有限公司 | 对远程方法调用的服务进行故障检查的方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN105005469A (zh) | 2015-10-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN105005469B (zh) | 一种基于Zookeeper和RabbitMQ的非阻塞调用方法 | |
CN103312528B (zh) | 一种心跳消息发送方法及用户终端 | |
CN102958107B (zh) | 一种能力查询的方法、通信终端及应用服务器 | |
US9083648B2 (en) | Method and system for performing remote network management on a voice home gateway terminal | |
CN104243281B (zh) | 基于移动互联网的语音通信方法 | |
US8850051B2 (en) | Methods, systems, and computer program products for transaction-based internet protocol (IP) telephony call processing | |
JP2019528495A5 (zh) | ||
NO20053478D0 (no) | Method for instant scheduling of conference calls | |
GB2429368A (en) | Method and System For Managing Communication Sessions Between a Text-Based and a Voice-Based Client | |
CN103098433A (zh) | 用于xmpp协议的servlet api和方法 | |
EP2315419B1 (en) | Method for transmitting context information to a called destination | |
CN103716356B (zh) | 基于web的存储过程操作方法、装置和*** | |
CN102075737A (zh) | 视频监控会话方法 | |
CN109151056B (zh) | 基于Canal的消息推送方法和*** | |
CN103548315A (zh) | 用于高性能低等待时间实时通知递送的方法和装置 | |
JP2009171566A (ja) | Sipの言語選好に基づいたスクリプト選定 | |
CN105577605A (zh) | 网页实时通信中采用基于WebSocket协议的双向REST的方法与服务器 | |
CN106789566A (zh) | 基于手机操作***的不同im应用消息共享方法和*** | |
US11228623B2 (en) | Method for transmitting media streams between RTC clients | |
US7539288B2 (en) | Apparatus and method for simulating a trunk gateway in a telecommunications switch test system | |
CN101997887A (zh) | 业务信令发送、接收、传送方法及终端 | |
US9374391B2 (en) | Composite endpoint mechanism | |
CN101317420A (zh) | 过滤会话发起协议消息的***、装置和方法 | |
CN106293714A (zh) | 一种基于数据层的改进ajax性能的方法 | |
CN104168176B (zh) | 一种即时通讯方法、客户端、服务器及*** |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |