我正在将Kafka用于消息传递应用程序。对于此应用程序,有一个生产者将消息放入一个主题中,而消费者将其注册到该主题中并使用这些消息。这些使用者是Dockerized应用程序。出于自动缩放的目的,每个使用者在创建后都会被注册为具有唯一ID的使用者。
假定以下情况:
Consumer1被创建为docker容器,并将其自身注册为ID为Consumer1
的使用者。
Consumer2被创建为docker容器,并将其自身注册为ID为Consumer2
的使用者。
现在,无论出于何种原因,Consumer1
都会失败,并被Consumer3
取代,Consumer3
将自己注册为ID为Consumer1
的kafka的使用者。
问题是,[DllImport("InjectDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern ulong FindProgramProcessId(string procName);
[DllImport("InjectDll.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)]
private static extern bool InjectIntoProcess(ulong procId, string Dll);
string ProcName = "random_test_game.exe";
string DllPath = @"C:\ProgramData\Hack\File.dll";
ulong procId = FindProgramProcessId(ProcName);
bool Injected = InjectIntoProcess(procId, DllPath);
已不再使用。从长远来看,将会有多个未使用的消费者。
是否可以动态自动地知道哪些使用者不再使用并删除它们?
答案 0 :(得分:0)
如果消费者1和消费者3属于同一消费者组,那么消费者3将开始从消费者1停止的地方读取消息。这是因为Kafka维护特定于消费者组的偏移量。因此,如果在具有相同消费者组的消费者中有一个失败,则其他消费者将使用偏移量并避免重新处理数据。
Kafka经纪人不会像您在问题中所假定的那样维护失败的使用者的日志。
答案 1 :(得分:-1)
您不必。 Kafka基于offset.retention.minutes
设置为您完成此设置,该设置控制在特定消费者组的所有消费者退出后,偏移量保持多长时间。并且,根据Kafka documentation:
事实上,唯一基于每个消费者保留的元数据是 该使用者在日志中的偏移量或位置。该偏移量是 由消费者控制...
... 这些功能的组合意味着Kafka的消费者来回便宜,对集群或其他方面没有太大影响 消费者。