我目前正在对一些通信中间件进行延迟基准测试,我发现 ZeroMQREQ
和REP
套接字速度非常慢。例如,我期望 ZeroMQ 会比 ZeroC Ice 快。为了完整起见,这里是迄今为止的测试结果:
- Ice 每秒 7600 条消息
- ZeroMQ 4300 - 每秒 4500 条消息
该消息是以数据结构作为参数的远程调用。数据结构包含基本类型的字段(int、float、double、boolean、string)。起初我怀疑使用 Protocol Buffers 序列化数据可能是 ZeroMQ 的瓶颈,但后来我使用空消息进行了测试,结果非常相似。即使 ZeroMQ 发送空消息,Ice 也更快。
尽管如此,我还是想给 ZeroMQ 一个公平的机会。REQ
本着这种精神,我想知道我是否可以REP
以任何方式提高速度。也许我应该使用其他套接字?唯一的限制是通信应该类似于 RPC。客户端在期望其消息的结果时不应做任何工作。
这是我的实现代码。我提供了 Java 版本的基准测试,但 Python(慢一点)和 C++(快一点)的结果非常相似:
客户
...
MQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REQ);
socket.connect("tcp://*:5555");
for(int i=0; i<measuredIterations; i++){
t0 = System.nanoTime();
socket.send("",0);
socket.recv(0);
rtt = System.nanoTime() - t0;
...
}
服务器
ZMQ.Context context = ZMQ.context(1);
ZMQ.Socket socket = context.socket(ZMQ.REP);
socket.bind("tcp://*:5555");
while (!Thread.currentThread().isInterrupted()){
socket.recv(0);
socket.send("",0);
}
其余代码基本上用于计算平均延迟和每秒消息数。
也许 ZeroMQ 对于这种通信模式来说只是慢,它在多对多通信模式中表现出色......
注意:我在记录结果之前“加热”了两个中间件。尽管如此,ZeroMQ 总是比 Ice 慢。
EDIT1:我将升温迭代次数增加到 10000。新结果是:
- Ice 每秒 8100 条消息(随着变暖而收敛到 8250)
- ZeroMQ + 协议缓冲区收敛到每秒 4650 条消息