每个用户的 GCP PubSub(或 GCP 任务)同步处理

GCP PubSub (or GCP Tasks) Synchronous Processing per User

我有一个用例,我需要处理一组事件。我需要他们为每个用户整体并行但串行地处理。这可以在 PubSub 中完成吗(也许是 GCP 任务?)?

例如:

6 个事件同时进入(User_A_Event_1、User_A_Event_2、User_B_Event_1、User_B_Event_2、User_C_Event_1、User_D_Event_1)。

我想按 UserID 对它们进行分组,并行处理每个用户,然后串行处理每个事件(后续事件处理要等到前一个事件成功完成后才会开始)。类似于:

如果重要的话,我不知道哪些用户会在什么时间举办活动。我们可能几个月都看不到用户的任何事件,然后开始收到很多事件。

我正在尝试找出一种在 GCP PubSub 中完成此操作的方法,但我也对其他解决方案持开放态度。我的偏好是通过推送而不是拉动来完成此操作,因为我可以在队列中没有任何内容的情况下进行很长时间。

感谢您的帮助。

克雷格

Cloud Pub/Sub's ordered delivery 在这里可以提供帮助。您将使用用户作为排序键。这意味着 Cloud Pub/Sub 将按照服务从您的发布者接收消息的顺序将消息传递给您的订阅者。有序交付将具有您想要的属性,其中您事先不知道用户集,并且特定用户的事件可能很少见或突发。

在订阅方,做出的保证取决于订阅者的类型。对于客户端库(使用流式拉取),您提供的回调将一次执行一个具有相同密钥的消息直至完成。对于使用 pull 的订阅者,每个 pull request 将包含一个密钥的消息,按照它们被接收的顺序排列,并且一个密钥的消息一次只会在一个 pull 响应中突出显示。对于推送订阅者,订购密钥的每条消息都将单独发送到您的端点,并且在确认同一密钥的上一条消息之前不会发送下一条消息。

请注意,Cloud Pub/Sub 的有序传递仍然具有至少一次传递语义,这意味着可以重新传递已确认的消息,这也会导致为同一密钥重新传递后续消息.

有关详细信息,请参阅 Medium post about ordering