从Mule服务器之间的S3平衡中消耗对象

时间:2016-01-26 19:52:44

标签: amazon-s3 architecture mule load-balancing

情景是这样的:

  • S3 Bucket充满了csv文件,每个文件都有数百个格式化的行。
  • N个Mule服务器。是否聚集。两种选择都可用。
  • 在所有mule服务器中安装了一个独特的Mule流程。
  • 骡流动行为很简单。将S3轮询到延迟获取可用文件,检索每个单个文件内容,将csv行转换为sql语句并插入DB中。

问题:

  • 来自不同Mule服务器的所有流程成功轮询s3,检索文件,处理它们并在DB中插入。因此,文件和注册表会被多次处理。
愿望清单:

  • 在所有活动服务器之间完成负载平衡。
  • 安装在不同mule服务器上的流量相等(我们不修改流量以获取不同的文件)
  • 其中的文件和注册表不会被处理两次

失败方法:

  • 我们在群集模式下尝试了所有mule服务器通用的已处理/未处理机制。我们使用Mule的3.5对象存储来保存已处理的文件列表,对所有服务器都可见。这里的问题是,我们没有平衡,所有工作负载都在一台服务器上,其余的几乎都是空闲的。

问题:

  • 哪个可能是最好的架构设计我们想要负载均衡?
  • 也许我们需要一个特定的骡子应用程序来进行s3文件下载,并且让它 应用程序,以平均分配Mule服务器之间的工作负载?

这是一个场景架构: enter image description here

1 个答案:

答案 0 :(得分:1)

配置S3存储桶以将事件推送到SQS队列(请参阅here),让您的mule服务器从该队列中提取事件,而不是轮询S3。这样,每个事件将仅由一名工人拉动。

它的工作原理如下:在每个worker中,您需要重复调​​用ReceiveMessage()以获取队列中的下一条消息。一旦工作人员收到消息,该消息在一定时间内对其他工作人员不可见(您可以通过setVisibilityTimeout()控制该消息)。在工作程序处理消息后,它应该调用deleteMessage()将其从队列中完全删除。如果工作人员失败,则不会调用deleteMessage(),因此在可见性超时期限之后,另一名工作人员将接收该消息。

换句话说,SQS中的队列不处理分发工作。工作人员在准备就绪时从队列中提取消息,这就是创建负载平衡的原因。