一、ØMQ的零拷贝


  • 零拷贝:ØMQ的消息API可让你直接从应用程序缓冲区发送和接收消息,而不用复制数据。我们称之为“零拷贝”,并且可以在某些应用程序中用它来提高性能
  • 零拷贝使用zmq_msg_init_data()来实现,一般不建议使用该函数,因为使用不好可能会带来内存泄漏
  • zmq_msg_init()函数介绍参阅
  • zmq_msg_init()演示案例:要做到零拷贝,你可以使用zmq_msg_init_data()创建一个消息,它指向在堆上分配的内存块,之后你可以调用zmq_msg_send()将数据发送出去。当你使用zmq_msg_init_data()创建消息时可以在第四个参数传递一个函数,用来释放堆上分配的内存块。代码如下:

void my_free(void *data, void *hint)
{
free(data);
}

char *buffer = (char*)malloc(1000);

zmq_msg_t msg;
zmq_msg_init_data(&msg, buffer, 1000, my_free, NULL);
zmq_msg_send(socket, &msg, 0);

  • 在接收时无法做到零拷贝:ØMQ传递给你一个缓冲区,你可以一直在其中存储数据,但它不会将数据直接写入应用程序的额缓冲区
  • 在写入方面,ØMQ的多部分消息能与零拷贝很好地合作:

  • 在传统的消息传递中(非ØMQ技术下),你就需要调度各个不同的缓冲区,将它们一起放入一个你可以发送的缓冲区。这意味着需要复制数据
  • 使用ØMQ,你可以将不同来源的多个缓冲区作为单独的消息帧发送(多部分消息),每个字段作为一个用长度分隔的帧发送。对于应用程序,它看起来像一系列的发送和接收调用,但在内部,多个部分是使用单个系统调用写入到网络上并读回的,所以它是非常高效的


二、内存泄漏处理


  • 如果你的ØMQ程序是使用C/C++程序编写的,那么就可能存在内存泄漏的情况
  • 在这里推荐一个内存泄漏的工具valgrind

三、消息丢失处理


  • 在使用ØMQ编写应用程序时,你会不止一次地遇到这问题:你期望得到的消息丢失了
  • 我们用下面一张图来遍历产生这种情况的最常见的原因:

聊聊ZeroMQ的专业术语“零拷贝“,以及内存泄漏处理、消息丢失处理_ØMQ的零拷贝


  • 如果你在失败要付出昂贵代价的上下文中使用ØMQ,那么要好好规划以避免失败的发生:

  • 首先,构建一个让你学习和测试你的设计的不同方面的原型。对它们施加压力,直到它们崩溃,以让你知道你的设计究竟有多强大
  • 第二,投资于测试。这意味着建立测试框架,以确保你能够获得具有足够计算能力的逼真设置,并抽出宝贵的时间,或借助其他力量,来严肃地进行实际测试。理想的情况是,一个团队写代码,另一个团队努力破坏它
  • 最后,务必让你的组织联系iMatix来讨论问题,并且如果它们出故障了,能够迅速被修复

  • 总之,如果你还没有证明某个框架能在现实条件下工作,那么它很可能会在最糟糕的时候崩溃。


  • 我是小董,V公众"笔记白嫖"解锁更多【ZeroMQ】资料内容。

聊聊ZeroMQ的专业术语“零拷贝“,以及内存泄漏处理、消息丢失处理_ØMQ的零拷贝_02