[zeromq-dev] One socket per thread or per call?

Patrick Boettcher patrick.boettcher at posteo.de
Tue Jan 31 13:35:29 CET 2017


On Mon, 30 Jan 2017 23:22:57 +0100
Patrick Boettcher <patrick.boettcher at posteo.de> wrote:
> I stressed this code and I don't see much difference between reusing
> one socket and this reconnect-implementation. (I have 20k REP-REQ per
> second, including json-decode/encode, in both cases)
> 
> Is there a more correct ZeroMQ-way of doing this?

On SO I saw a related question where someone asked for a socketPool.
Seems not to exist in zmq - so I created one for my needs:

It is a thread-safe SocketPool "one-socket per thread":

  class socketPool
  {
      std::string endpoint_;

  public:
      socketPool(const std::string &ep) : endpoint_(ep) {}

      zmq::socket_t & operator()()
      {
          thread_local static zmq::socket_t socket(
                  globalContext(), 
                  ZMQ_REQ);
          thread_local static bool connected;

          if (!connected) {
              connected = true;
              socket.connect(endpoint_);
          }
  
          return socket;
      }
  };

  // creating a pool for a specific endpoint
  socketPool httpReqPool("ipc://http-concentrator");

Then 

  bool sendMessage(std::string s)
  {
      zmq::socket_t &socket = httpReqPool();
      // the rest as before
  }

The key here is the thread_local-storage from C++11.

--
Patrick.



More information about the zeromq-dev mailing list