ZMQ多线程C客户端
我想要多线程ZMQ多线程C客户端,c,multithreading,zeromq,C,Multithreading,Zeromq,我想要多线程zmq客户端的C示例,我已经在使用多线程服务器,但我要求每个客户端从多线程而不是从单个线程发送请求 我看了一下: 但我没有看到使用多线程的ZMQ\u交易商socket与多线程服务器(一个ZMQ\u路由器socket)对话的客户端示例 因此,我正在寻找经销商和路由器模式。我希望客户机(经销商是多线程的: 若我遵循多线程服务器示例的相同类比,我需要一个绑定多个线程的代理,对吗 或 使用pthread\u create是否足够 目前我的客户机与hello world C类似:
zmq
客户端的C示例,我已经在使用多线程服务器,但我要求每个客户端从多线程而不是从单个线程发送请求
我看了一下:
但我没有看到使用多线程的
ZMQ\u交易商
socket与多线程服务器(一个ZMQ\u路由器
socket)对话的客户端示例
因此,我正在寻找经销商
和路由器
模式。我希望客户机(经销商是多线程的:
- 若我遵循多线程服务器示例的相同类比,我需要一个绑定多个线程的代理,对吗
或
- 使用pthread\u create
是否足够
目前我的客户机与hello world C类似:
zctx_t ctx = zctx_new ();
void *client = zsocket_new (ctx, ZMQ_REQ);
assert (client);
zsocket_connect (client, config.SERVER_ENDPOINT);
// SKIPPED: I get the data (hm->body.p) to be send through zmq...
// We send a request, then we work to get a reply
zstr_sendf(client, "%.*s", (int) hm->body.len,hm->body.p);
char *reply = zstr_recv (client);
if ( reply ) {
zsys_info ("server replied (%s)", reply);
free (reply);
}
请帮助我使我的C客户机成为多线程zmq
客户机
更新1(更多详细信息):
3pa
平均每秒向HTTP侦听器发送4个请求(每个请求大小约60 KB)(我使用的是mongoose)3pa
仅在收到“HTTP/1.1 200 OK\r\n”
“reply”或发送请求超时后发送下一个HTTP POST
。因此3pa
似乎是单线程的200 OK
,则3pa
将在内存中保持排队,直到崩溃3pa
的请求时,我需要使用ZMQ通过3G移动分组网络将其发送到后端服务器。由于3G移动分组网络的延迟和带宽,每个请求需要大约1-3秒才能发送,ZMQ replay新ZFrame(“OK”)
启动、传输和交付(在3pa
端接收)大约需要1-3秒因此,如果我们进行基本计算,
3pa
队列容量将由于3G移动分组网络的性能而迅速填满。从OP/Update 1中提供的几个细节来看,在谈论增加线程数量的想法之前,让我们先关注问题的根本原因
真正重要的是什么? 鉴于
3pa
作为黑盒引入,具有经验丰富的阻塞设计(表示永远等待,直到200 OK
交付,并在超时事件中转义)最好的第一步是按原样操作
3pa
,而是在更好的NIX对等/托管中心托管/托管,而不是在当前昂贵的3G移动分组无线接入网络的“外围”最后一英里部分,这既可以避免/防止在任何优先呼叫流量抢占3G信道并阻塞RAN的情况下,容量驱动的DoS引入的数据包重新传输,也可以绝对减少往返延迟的成本,目前在上述2~6秒以上的水平上支付
如果3pa
重新定位到自己的NIX邻近位置不足以保存游戏,那么下一步可能是创建一个单一用途的http代理,该代理将接收60KB以上的http请求(该请求将被转发到适当的目标)这将立即向下游注入200OK
响应到3pa
手中,从而将其从内部阻塞循环中解锁,并允许其发送另一个排队的HTTP POST
肮脏?是和否。它解决了较差的3pa
设计的弱点,并允许在特定情况下操作
最后一个注意事项-在实际场景中避免使用
REQ/REP
模式。
尽管ZeroMQ可伸缩的正式通信模式构建块是多方通信方案的智能示例,但不要期望它们对LoS、丢失消息和其他现实问题免疫REQ/REP
模式能够在解除轨道的内部FSA状态下使自身死锁,在这种状态下,没有(字面上是零)工具可以将成对的FSA状态机从无法解除的相互死锁状态保存/恢复
在这种设计中使用其他一些可伸缩的正式通信模式,并准备好在出现问题时提供额外的信令手段,以满足挽救状态的潜在需要。ZeroMQ有很多工具可以更智能地实现这一点,而不仅仅是依靠一个简单的原型,闭上眼睛,相信一切都将永远无差错地工作(这不是我们生活的现实,对吧:o))
现实世界中的客户端操作许多zmq套接字实例,一些用于发送信号,一些用于传输服务,一些用于远程访问客户端的内部CLI接口,另一些用于分布式日志收集器,一些用于自诊断和托管系统健康检查。简单的、主要是非阻塞设计的客户端可能包含数千个SLOC,因此不要指望任何此类解决方案只包含来自图书馆wiki页面或一些精彩博客文章的几个SLOC的副本
你可能还想,还可以链接到神奇的Pieter HINTJENS的书,自从我开始喜欢ZeroMQ的思维方式和设计优先顺序以来,这一直是我的必读推荐书。信不信由你,值得花时间和精力,分布式处理还有其他更重要的规则,而不仅仅是为了糟糕和不可行的设计而要求更多的线程。能够将糟糕的设计变为糟糕的设计