我打算在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上的文档承诺将传递所有消息部分,或者不会传递任何消息部分。但是,我不确定库如何决定哪些消息部分来自同一消息。如果在它们之间发生发送错误,它是否认为来自同一消息的两个消息部分?
答案 0 :(得分:1)
- 当您发送多部分消息时,第一部分(以及所有后续部分)仅在您发送时实际上在线路上发送 最后一部分。
- 您将收到邮件的所有部分,或者根本不收到任何部分。
您可以随时发送单个部分消息并组装它们并管理接收端的故障
答案 1 :(得分:0)
我不确切知道会发生什么,但是逻辑决定了3个结果中的一个:
0
而不是ZMQ_SNDMORE。第一条消息将被删除,第二条消息将重新开始。0
而不是ZMQ_SNDMORE。第一条消息仍然是开放的,您的第二条消息是#34;将是第2帧,你的第2&#34;身体&#34;将是第3帧,并且消息将仅发送3帧而不是2,错误地我的期望是,第二种可能性是会发生什么,如果呼叫失败,它应该产生零副作用,所以它就好像从未发生过。 the man page上有关您可能遇到的几种错误类型的信息支持这一点。特别是它看起来应该是一个非常罕见/特殊的情况,其中第二部分的第一部分将被第二部分接受。