C# 用于类缓存服务的ZeroMQ体系结构

C# 用于类缓存服务的ZeroMQ体系结构,c#,multithreading,zeromq,netmq,C#,Multithreading,Zeromq,Netmq,我做了一个服务,它在NetMQ中的0MQ路由器套接字上接受请求,其作用主要类似于其他应用程序的缓存,即它可以接收“GET”请求并发送响应,也可以接收不需要响应的“PUT”请求 不过,我有两个问题: 我尝试在客户端代码中使用RequestSocket,但如果在发送消息后不等待响应,它仍然失败(我猜这就是REQ/REP在0MQ中的工作方式)。如果我只想获得某些消息类型的响应,那么什么是合适的0MQ套接字类型 当前,我的客户端代码在需要与服务通信时创建一个新的RequestSocket实例。在Net

我做了一个服务,它在NetMQ中的0MQ路由器套接字上接受请求,其作用主要类似于其他应用程序的缓存,即它可以接收“GET”请求并发送响应,也可以接收不需要响应的“PUT”请求

不过,我有两个问题:

  • 我尝试在客户端代码中使用
    RequestSocket
    ,但如果在发送消息后不等待响应,它仍然失败(我猜这就是REQ/REP在0MQ中的工作方式)。如果我只想获得某些消息类型的响应,那么什么是合适的0MQ套接字类型

  • 当前,我的客户端代码在需要与服务通信时创建一个新的
    RequestSocket
    实例。在NetMQ中是否有一种线程安全的方式,在需要发送请求和获得响应时,可以通过客户端代码重用单个套接字,而无需每次创建新连接

  • 服务代码目前基本上是:

    var socket = new RouterSocket(endpoint);
    socket.ReceiveReady += (sender, e) =>
    {
        var msg = e.Socket.ReceiveMultipartMessage();
        var action = msg[3].ConvertToString();
        switch (action)
        {
            case "GET":
            {
                var key = msg[4].ConvertToString();
                var data = _cache.Get(key);
                var response = new NetMQMessage();
                response.Append(msg[0]); // msg id
                response.Append(NetMQFrame.Empty);
                response.Append(msg[4]);
                response.Append(data);
                e.Socket.SendMultipartMessage(response);
            }
            break;
    
            case "SET":
            {
                var key = msg[4].ConvertToString();
                var data = msg[5].Buffer;
                _cache.Set(key, data);
    
                // no response needed here, but needed for RequestSocket clients                
            }
            break;
    
            default: throw new NotImplementedException();
        }
    };
    

    你试过DealerSocket吗?我认为这是RequestSocket的“异步”对应。您尝试过DealerSocket吗?我认为这是RequestSocket的“异步”对应。