我是新消息队列,现在我在我的 Linux服务器上使用 ZeroMQ.我正在使用PHP来写入客户端和服务器.这主要用于处理推送通知.

正如他们已经证明的那样,我正在使用单一的I / O线程的ZMQContext实例上的基本REQREP正式通信模式.

这是最小化的zeromqServer.PHP代码:

include("someFile.PHP");

$context = new ZMQContext(1);

//  Socket to talk to clients
$responder = new ZMQSocket($context,ZMQ::SOCKET_REP);
$responder->bind("tcp://*:5555");

while (true) {
    $request = $responder->recv();
    printf ("Received request: [%s]\n",$request);

    //  -----------------------------------------------------------------
    //                                    Process push notifications here
    //
    sleep (1); 

    //  -----------------------------------------------------------------
    //                                          Send reply back to client
    $responder->send("Basic Reply");
}

这里是一个最小化的ZeroMQ客户端:

$context = new ZMQContext();

//  Socket to talk to server
echo "Connecting to hello world server…\n";
$requester = new ZMQSocket($context,ZMQ::SOCKET_REQ);
$check = $requester->connect("tcp://localhost:5555");

var_dump($check);
$requester->send("json string payload with data required to process push notifications.");

//$reply = $requester->recv();

那么,我做什么?我使用linux命令运行zeromqServer.PHP作为后台服务

nohup PHP zeromqServer.PHP &

这将作为后台进程运行.现在,当客户端调用它时,它执行所需的作业.

但问题是,我需要重新启动该过程,每次任何文件(包括在zeromqServer文件中包含的文件)发生变化.

而且,不管怎样,2-3天后,它只是停止工作.该过程不会停止,但它只是停止工作.

我觉得它一定是一些socket问题,也许socket不再打开了.那时候我必须重新启动zeromqServer.PHP文件进程.

Q1:可能是什么问题?

Q2:这样做的正确方法是什么?

这不是使用消息队列TLDR的正确方法

A1:问题是您的服务器最终必须阻止,因为客户端代码在REQ / REP模式需要这样做时才能检索任何答案. REP侧的zeromqServer.PHP将不会尝试从客户端(在正式通信缓冲区的REQ端)recv()另一个消息,直到客户端被物理传送(内部缓冲区)并具有recv( ) – 来自zeromqServer.PHP端的“reply”-message.

ZeroMQ的早期版本,ver. 2.1数据被复制到O / S内核中之前,已经使用了一个节点的内部消息队列和内存管理的无限制,无限大的默认限制,用于低级I / O线程缓冲.资源,并从ZeroMQ内存发布.

较新版本的ZeroMQ,ver 3.x,默认情况下具有所谓的HWM-s(又称High-Water-Mark-s)“只”1000个消息为“short”的消息,之后,这些ZeroMQ资源的相应部分开始阻止或删除邮件.

虽然显式增加HWM设置管理的反应性尝试看起来像一个肮脏的方法来解决主设计错误,但是另一个ZeroMQ警告在这方面是公平的,以便进一步谨慎地朝这个方向前进(ØMQ不保证套接字将接受为许多作为ZMQ_SNDHWM消息,并且根据套接字上的消息流量,实际限制可能会降低多达60-70%).

忘记或无法做到这一点(参考:OP代码已经展示):

//$reply = $requester->recv();

意味着您的REQ / REP正式通信模式“摆”成为不可逆转的僵局(永远).

A2:基本REQ / REP正式通信 – 模式听起来很直观,但有一些危险的特征,观察到的阻塞只是其中之一.部署XREQ / XREP,DEALER / ROUTER等工具可能需要采取一些额外的步骤,但是应该修改设计,而不仅仅是SLOC的SLOC,因为似乎有很多事情要实现,在设计代码之前.一个主要的错误之一是假定一个send()方法已经被命令发送一个消息. ZeroMQ并非如此.代码设计也应该假定消息传递的不确定性,正确地处理丢失的消息问题和任何类型的分布式服务阻塞事件(死锁,活动锁定,缓冲区阈值溢出,旧/新API冲突等)没有任何明确的保证您的消息传递对等体(ZeroMQ中没有中央消息代理)具有与其本地主机端实现的相同版本的ZeroMQ API /协议 – 所以确实有很多新的观点代码设计)

最好的方式来做到这一点

如果您能信任并相信一个实践经验,您最好的下一步应该是下载并阅读fabulous Pieter HINTJENS’ book "Code Connected,Volume 1",其中Pieter对分布式处理有很多见解,包括许多提示和可靠模式的指示,就像你想实现的那样.

阅读这本书,这是值得你的时间,如果你留在分布式软件设计,你可能会多次重读这本书,所以不要犹豫,立即开始从大师大师跳到这样一本400页的食谱,Pieter HINTJENS出来的问题是.

为什么?现实世界通常要复杂得多

只需一张照片,从上述图中可以看出,图60中忽略了个人原型的重用,并意识到需要一个适当的端到端分布式系统设计视角.阻塞避​​免和僵局解决策略:

只需要有一些想法,请查看以下代码示例,从简单的分布式消息传递,其中aMiniRESPONDER进程使用多个ZeroMQ通道.

如何在相当大的Web应用程序域中改进实现?

了解如何同时防止(设计上)和处理(deux-ex-machina类型)其他冲突.PHP已经拥有这种类型的算法的所有正确的语法构造器,但是架构和设计在你手中,从头到尾.

只需要意识到,一个ZeroMQ信令基础架构设置/系统部分/ ZeroMQ格式终止工作的碰撞感知{try :,except :,finally:}风格有多大,只需按行号检查[SoW]:

14544 - 14800 // a safe infrastructure setup on aMiniRESPONDER side   ~ 256 SLOCs
15294 - 15405 // a safe infrastructure gracefull termination          ~ 110 SLOCs

与aMiniRESPONDER示例的事件处理段的核心逻辑相比

14802 - 15293 // aMiniRESPONDER logic,incl. EXC-HANDLERs             ~ 491 SLOCs

基于ZeroMQ的分布式系统的最终奖励

苛刻?是的,但非常强大,可扩展,快速&确实有益于正确使用.不要犹豫投资你的时间&努力获取和管理您在这个领域的知识.您所有进一步的软件项目都可能受益于此专业投资.

php – 这是使用消息队列的正确方法吗?的更多相关文章

  1. HTML5实现直播间评论滚动效果的代码

    这篇文章主要介绍了HTML5实现直播间评论滚动效果的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. 前端监听websocket消息并实时弹出(实例代码)

    这篇文章主要介绍了前端监听websocket消息并实时弹出,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. HTML5之消息通知的使用(Web Notification)

    通知可以说是web中比较常见且重要的功能,私信、在线提问、或者一些在线即时通讯工具我们总是希望第一时间知道对方有了新的反馈。本篇文章主要介绍了HTML5之消息通知的使用(Web Notification),感兴趣的小伙伴们可以参考一下

  4. HTML5中的Web Notification桌面通知功能的实现方法

    这篇文章主要介绍了HTML5中的Web Notification桌面通知功能的实现方法,需要的朋友可以参考下

  5. HTML5仿微信聊天界面、微信朋友圈实例代码

    小编最近开发一个基于html5开发的一个微信聊天前端界面,功能很全面,下面小编给大家分享实例代码,需要的朋友参考下

  6. HTML5的postMessage的使用手册

    HTML5提出了一个新的用来跨域传值的方法,即postMessage,这篇文章主要介绍了HTML5的postMessage的使用手册的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. ios – Testflight无法安装应用程序

    我有几个测试人员注册了testflight并连接了他们的设备……他们有不同的ios型号……但是所有这些都有同样的问题.当他们从“safari”或“testflight”应用程序本身单击应用程序的安装按钮时……达到约90%并出现错误消息…

  8. xcode找不到匹配的配置文件

    我有一个AdhociOS应用程序,它给了我“在xcode6中找不到匹配的配置文件”,我创建了一个Adhoc配置文件,下载它,双击它并在General–Identity下选择了一个团队.但我接着得到了那条消息,并尝试使用“修复问题”按钮没有帮助.在构建设置–供应配置文件–发布我有“自动”.任何人都可以帮助我,我完全迷失了……

  9. ios – Reactive Cocoa – 以编程方式设置文本时不会调用UITextView的rac_textSignal

    我正在实现一个聊天UI,并使用ReactiveCocoa根据用户的类型调整聊天气泡的大小.目前,我正在基于textview的rac_textSignal更新UI的布局.一切都很好–除了一点:当用户发送消息时,我以编程方式清除文本字段:…我是否需要拥有一个持有currentTypedString的Nsstring,并在该字符串更新时驱动UI更改?

  10. ios – 当我关闭应用程序时,我从调试器获得消息:由于信号15而终止

    我怎么能解决这个问题,我不知道这个链接MypreviousproblemaboutCoredata对我的问题有影响吗?当我cmd应用程序的Q时,将出现此消息.Messagefromdebugger:Terminatedduetosignal15如果谁知道我以前的问题的解决方案,请告诉我.解决方法>来自调试器的消息:每当用户通过CMD-Q(退出)或STOP手动终止应用程序(无论是在iOS模拟器中还是

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部