云发布/子订阅服务器max_messages无法使用消息排序



我正在使用Cloud Pub/Sub构建作业队列,我希望按照Pub/Sub服务接收消息的顺序接收消息。我创建了一个主题和一个启用了消息排序的订阅。我正在用google-cloud-pubsub包用Python开发我的系统。正如本文档中所建议的,我必须发布带有排序键的消息。

如果消息具有相同的排序键,并且您将消息发布到相同的区域,则订阅者可以按顺序接收消息。

在订阅者端,我需要批量处理消息,所以我使用max_messages参数进行控制。但是,当我启用消息排序选项时,每次都无法按预期提取max_messages消息,而只能从订阅中提取一条消息。奇怪的是,当我禁用消息排序时,它会返回max_messages消息。

发布者代码:

...
topic_path = 'xxx'
ordering_key = '202011240000'
while True:
job = {'job_id': 'xxxxxx', 'foo': 0, 'bar': 0}
data = json.dumps(job, default=str).encode('utf-8')
publisher.publish(topic_path, data=data, ordering_key=ordering_key)
time.sleep(1)

用户代码:

...
subscription_path = 'xxx'
subscriber.pull(request={'subscription': subscription_path, 'max_messages': 300})
...

我做错了什么,或者Pub/Sub就是这样设计的?

max_messages属性并不意味着服务器将保证返回该数量的消息,即使它们是可用的。对于有序传递,返回到单个拉取请求的消息批次包含最大消息数的可能性更小,因为必须进行更多的协调才能确保消息按顺序发送,尤其是在使用单个排序键的情况下。服务器尝试不将等待发送更多消息的请求保持太长时间,因为否则端到端延迟可能会变得更加困难。

有两种方法可以解决这个问题。第一种是切换到Cloud Pub/Sub客户端库,该库使用流式拉取,因此能够更好地在消息可用时立即传递消息,因为有一个持久的连接来传递消息。

第二是确保你同时有很多出色的表现。请注意,这对单个排序键的情况没有帮助,因为一次只能有一个排序键的消息列表未处理。如果您有许多订购密钥,这可能会有所帮助。

有关传递语义的更多信息,请参阅";"按顺序接收消息";订购密钥的部分中邮。

最新更新