当最终部分发送失败时,ZeroMQ多部分消息会发生什么?

时间:2015-01-09 07:32:48

标签: c zeromq

我打算在ZeroMQ中使用多部分消息,但是当我在发送最后一个消息部分之前收到发送错误时,我需要知道最初排队的消息部分会发生什么。

例如,假设我有一个PUSH套接字,我发送一个两部分消息,因为我从不同的来源收集标题和正文。如果标题发送正常,但发送正文时出错,会发生什么?在我尝试发送另一条消息之前,标头是否仍保留在套接字的出站队列中,或者由于正文发送中的错误导致标头丢失?

也许某些代码会使问题更加精确:

int header[] = {1, 2, 3};           // <- Header From Source 1
int body[]   = {4, 5, 6, 7, 8, 9};  // <- Body From Source 2

void *ctx  = zmq_ctx_new();
void *push = zmq_socket(ctx, ZMQ_PUSH);

zmq_connect(push, "tcp://localhost:7890");

int headerSent = 0;
int bodySent   = 0;

headerSent = zmq_send(push, &header[0], sizeof(header), ZMQ_SNDMORE);
if (-1 != headerSent)
{
    bodySent = zmq_send(push, &body[0], sizeof(body), 0);
    // What if ^-- this fails?
}

// Do some other processing to prepare a new header and body here...

headerSent = zmq_send(push, &header[0], sizeof(header), ZMQ_SNDMORE);
if (-1 != headerSent)
{
    bodySent = zmq_send(push, &body[0], sizeof(body), 0);
}

我是否可以在此处获得带有两个标头的消息,或者当后续发送由于(例如)信号中断而失败时,ZeroMQ是否丢弃使用ZMQ_SNDMORE标志提交的初始消息部分?我希望是这种情况,因为zmq_send上的文档承诺将传递所有消息部分,或者不会传递任何消息部分。但是,我不确定库如何决定哪些消息部分来自同一消息。如果在它们之间发生发送错误,它是否认为来自同一消息的两个消息部分?

2 个答案:

答案 0 :(得分:1)

ZeroMQ Guide

  
      
  • 当您发送多部分消息时,第一部分(以及所有后续部分)仅在您发送时实际上在线路上发送   最后一部分。
  •   
  • 您将收到邮件的所有部分,或者根本不收到任何部分。
  •   

您可以随时发送单个部分消息并组装它们并管理接收端的故障

最近更新:Pieter Hintjens: The End of ZeroMQ Multipart

答案 1 :(得分:0)

我不确切知道会发生什么,但是逻辑决定了3个结果中的一个:

  1. 第二帧失败,将成功处理multipart参数中的0而不是ZMQ_SNDMORE。第一条消息将被删除,第二条消息将重新开始。
  2. 第二帧失败, 已成功处理multipart参数中的0而不是ZMQ_SNDMORE。第一条消息仍然是开放的,您的第二条消息是#34;将是第2帧,你的第2&#34;身体&#34;将是第3帧,并且消息将仅发送3帧而不是2,错误地
  3. ZMQ的裤子会围绕脚踝,并处于某种错误状态,会以意想不到的方式作出反应。
  4. 我的期望是,第二种可能性是会发生什么,如果呼叫失败,它应该产生零副作用,所以它就好像从未发生过。 the man page上有关您可能遇到的几种错误类型的信息支持这一点。特别是它看起来应该是一个非常罕见/特殊的情况,其中第二部分的第一部分将被第二部分接受。