我有一个消费者项目,它使用Kafka主题的数据。该流中90%的数据可以实时处理,但对于特定记录(~10%),我需要延迟处理。
我应该在同一个JVM中有两个独立的消费者,并且消耗一个消费者中90%的记录而忽略10%并让其他消费者处理它或将10%的消息推送到另一个主题并延迟另一个消息的处理话题?
如果我能有一个单一的消费者和两个检查点机制,一个90%,另一个延迟10%,但Kafka客户似乎不支持这个用例,那将是很好的。这将有助于我避免任何不必要的反序列化和网络IO。
对于单个消费者来说,不可能有多个检查点 - 要么使用两个消费者,要么使用两个主题。
events
主题将被处理并分为两个主题historical-events
和realtime-events
。您仍然会有两个消费者,但不会有相同的主题。正如您所建议的那样,您也可以只使用events
主题,处理即时数据并将历史数据发送到其他主题(因此您有两个主题而不是三个主题,并且承诺偏移没有问题) - 但这意味着更多的IO用于该过程客户,以及客户的两项责任
由于您只有一个消费者从基本主题中读取每条消息,因此它将始终是最近的或历史的,因此您不会遇到上一个问题。您的选择在很大程度上取决于您的问题(IO,RAM,只是有正确的行为)。从一开始就分离两个主题可能是最容易实现的,可以在一个单独的过程中完成,有效地分离每个过程的责任,并将对处理客户端的影响降至最低。