Google PubSub:如何自定义向消费者分发消息?

Google PubSub : How to customize distribution of messages to consumers?

我有一个场景,我们将客户数据发送到 pubsub 并与 java 订阅者一起使用。我有多个订阅者订阅了同一个订阅。有没有办法将同一客户 ID 的所有消息路由到同一订阅者?

我知道 Google Dataflow 具有基于会话的窗口。但是,我想知道我们是否可以使用简单的 java 消费者来实现它。

2020 年 6 月更新Filtering 现在是 Google Cloud Pub/Sub 中的一项可用功能。创建订阅时,可以指定一个查看消息属性的过滤器。如果消息与过滤器不匹配,Pub/Sub 服务会自动确认该消息而不将其传递给订阅者。

在这种情况下,您需要有不同的订阅,并且每个订阅者都将使用来自其中一个订阅的消息。每个订阅都会设置一个过滤器来匹配客户 ID。如果您知道客户 ID 列表并且它很短,您可以为每个客户 ID 设置一个完全匹配过滤器,例如,

attribute.customerID = "customerID1"

如果您有很多客户 ID 并且想要对每个订阅者收到的 ID 集进行分区,您可以使用前缀运算符来实现。例如,如果 ID 是数字,您可以使用如下过滤器:

hasPrefix(attribute.customerID, "0")
hasPrefix(attribute.customerID, "1")
hasPrefix(attribute.customerID, "2")
hasPrefix(attribute.customerID, "3")
...
hasPrefix(attribute.customerID, "9")

上一个回答

目前,Google 云 Pub/Sub 无法过滤发送给特定订阅者的消息,没有。如果您先验地知道您拥有的订户数量,您可以自己计算。您可以创建与订阅者一样多的主题,然后将客户 ID 存储到不同的主题中,将消息发布到每个客户 ID 的正确主题。您将为每个主题创建一个订阅,每个订阅者都会收到来自其中一个订阅的消息。

缺点是,如果您有任何订阅者想要所有客户 ID 的数据,那么您必须对每个主题进行额外订阅,并且该订阅者必须从所有这些订阅中获取消息。

请记住,您不想创建超过 10,000 个主题,否则您可能 运行 与 quotas 对抗。