具有ZeroMQ的多线程Boost.ASIO

时间:2016-11-16 14:45:58

标签: c++ multithreading c++11 boost-asio zeromq

我有一个HTTP-ZeroMQ网关,它在一端接受POST请求并在Zmq上转发它们,然后将响应路由回来。

http服务器与Boost.ASIO和Beast完成异步,并在6个线程的线程池上运行。通过从多个线程调用io_service.run()来完成线程池。 zmq部分非常天真:对于每个http请求,它创建一个新的REQ(tcp)套接字并同步等待响应。

这显然性能很差,因为它为每个请求创建了一个新的zmq / tcp链接,并且处理线程被阻塞直到响应到达(2-3秒)。我想使zmq部分同步,但我有一些问题。有一个相当简单的方法可以使zmq套接字ASIO友好(herehere),我更关心线程,因为zmq文档建议仅使用来自创建线程的套接字。

我有三个选择:

  1. 在每个线程池线程中使用thread_local创建一个zmq套接字。在这种情况下,我没有找到任何方法告诉ASIO在正确的线程(创建套接字)上运行zmq套接字读取完成处理程序。如果在另一个线程中运行,处理程序将看到一个不同的thread_local套接字,而不是可用于读取的套接字。
  2. 与上面类似:一个套接字/线程,但没有thread_local。在这种情况下,我没有看到任何保证从正确的线程访问套接字,或者满足线程之间的套接字迁移要求
  3. 有一个受互斥锁保护的单个套接字(AFAIK,它在线程之间执行zmq套接字迁移所需的完全内存屏障),但是为所有线程提供单个共享资源并不能很好地扩展,我不会#39; t喜欢它
  4. 服务器也进行一些数据处理,所以我不想让它成为单线程。

    那么,任何想法如何在多线程ASIO应用程序中优雅地处理zmq套接字异步?

    ps:我确实看到了AZMQ,但我现在不想再引入另一个第三方库。

0 个答案:

没有答案