对脉冲星key_shared订阅类型按密钥分组消息



假设我有一组无界密钥,用于发布到脉冲星主题的消息。

{k0, k1, ..., kn}

和一组有限的预期消息类别,其中类别信息是消息有效负载的一部分。

{c0, c1, c2}

每当使用给定键的所有消息类别时,我想在应用程序中调用一个操作。例如,如果我看到下面的键/类别对,我希望看到一个操作被调用。

{(k0, c0), (k0, c1), (k0, c2)} => action invoked for key k0
{(k1, c0), (k1, c1), (k1, c2)} => action invoked for key k1

为了确保应用程序的弹性,我只在所有类别都被使用后才返回消息。如果属于同一类别的消息被使用了两次,我可以返回较旧的消息,每个类别保留一条消息。

现在,假设我有一个附加到订阅的消费者,并配置了key_shared订阅类型。我们使用以下键/类别对。

{(k0, c0), (k0, c1)}

在等待(k0, c2)时,第二个消费者被添加到订阅中。根据这个问题,新的消费者将不会收到消息,直到现有的消费者ack或nack挂起的消息。这似乎是预期的行为,而且确实是我所看到的行为。

我想知道是否有一种更习惯的方式来实现这个功能?为了实现这种分组行为,延迟消息的打包有意义吗?

使用带有故障转移订阅类型的分区主题可以实现我们的设计目标。下面是我们探索的方法和观察到的行为的描述。

具有key_shared订阅的非分区主题

当应用程序向外扩展(向订阅添加更多消费者)时,任何挂起的消息(传递给消费者但尚未打包的消息)都会导致新消费者无法接收任何消息,直到挂起的消息被打包/打包或先前存在的消费者取消订阅。

带有故障转移订阅的分区主题

当应用程序向外扩展时,在消费者之间均匀地重新分配主题/分区对,并重新交付挂起的消息(如果有的话)。当主题分区的所有权发生变化时,需要通知消费者,以便清除内部状态,为此可以使用消费者事件侦听器。

最新更新