了解ZeroMQ:如何将文件从多个源发送到单个接收器?

时间:2013-08-21 13:20:23

标签: zeromq reliability

我有一堆服务器,不断生成文件。这些文件需要发送到中心位置。文件永远不会超过50MB。我打算使用ZeroMQ发送这些文件(封装在消息中),这样在中心位置写入的文件不会同时发生(例如,使用scp进行传输会在目标上启动许多磁盘写入进程)。

我可以通过ZeroMQ看到几种方法:

  1. 在生产者上使用REQ套接字,在使用者上使用单个REP套接字。这可能会奏效,但我认为它会让生产率较低的生产商挨饿,因为没有公平的排队。另外,如果REP套接字不可用,我不确定REQ套接字是否会丢弃消息。
  2. 在生产者处使用PUSH套接字,在使用者处使用PULL套接字。这对消费者有公平的排队,文档说PUSH套接字never discard messages。但是,它完全可靠吗?
  3. 我的可靠性要求是:

    1. 不应丢失消息(在我的案例文件中)。所以我想以这样一种方式构建它,即生产者对消费者收到的每条消息都有一个确认。
    2. 来自特定制作人的消息应按照制作时的顺序接收。
    3. 生产者可以来去匆匆,他们应该抵制消费者在一段时间内无法使用。
    4. 哪种插座适合此类应用?任何指向我应该看到的zmq模式的指针都会很棒。

1 个答案:

答案 0 :(得分:0)

REQ / REP方法似乎是这项任务的最佳方法,因为消息数量少且需要高可靠性。

  1. 以允许您查找创建顺序的方式将文件存储在每个生成器上(文件名中的时间或db中的文件索引)
  2. 每个生产者应选择最旧的文件,将其发送到套接字并等待ACK回复。应在ACK时删除文件(或标记为已发送)。
  3. 消费者应该从套接字读取文件内容,将其刷新到磁盘并随后发送ACK消息。
  4. 制作人应该在收到上一个文件后才发送下一个文件。
  5. 这可能有用,但是我看到一个主要问题:几个生产者将淹没消费者的网络接口,即使他们没有攻击磁盘或在消费者上产生进程。 在使用生产者启动的文件传输的任何设计中,这应该是一个问题。 PUSH / PULL插座也会出现同样的问题。

    需要注意的另一点是:ZeroMQ消息在内存中缓冲,直到收到整个消息。因此,每个发送50MB文件的20个制作者将需要峰值1GB RAM。

    作为替代方案,我建议只向文件夹发送文件名,然后按顺序提取文件。