我一直在尝试将长时间运行的进程从一个应用程序迁移到另一个应用程序。使用qpid质子(AMQP 1.0)实施队列,并将代理托管在AWS中。一个应用程序发送一条带有有效负载的消息,其中包括许多将要处理的对象ID(在这种情况下,将其插入到postgres数据库中)。 unpacker
队列获取这些ID,然后将一条消息发送到saver
队列,该队列正在侦听消息并逐个存储对象。 unpacker
将这些单个消息包装在事务中,就像这样(为简洁起见,删除了大量代码):
def send(self, transaction):
# Get payload
payload = transaction.packed_payload
# Unpack messages
unpacked_messages = self.unpack_data(payload)
for message in unpacked_messages:
proton_message = Message(body=message)
transaction.send(self.sender, proton_message)
transaction.commit()
还有saver
,就像这样:
def on_message(self, event):
message_body = json.loads(event.message.body)
# data saving logic here
如果打包的事务中有1000个或更少的对象,这恰好可以很好地工作。但是,对于更大的数量(这肯定是生产案例),事务显然将在提交时成功,但是仅将处理1000条消息,并且将出现以下错误:
ERROR:proton:Could not process AMQP commands
我试图使max_prefetch
和constantPendingMessageLimitStrategy
无济于事,因为它会持续关闭AWS和本地的第1000条消息的连接。
我是否缺少有关ActiveMQ及其队列配置的信息?什么可以解释这种行为?