Kafka-键的删除
如果只为每个键保留最近的一个消息,那么当需要删除某个特定键所对应的所有消息时,需要怎么做?比如一个用户不再使用我们的服务,那么完全可以把与这个用户相关的所有信息从系统中删除。
为了彻底把一个键从系统里删除,应用程序必须发送一个包含该键且值为null的消息。清理线程发现该消息时,会先进行常规的清理,只保留值为null的消息。该消息(被称为墓碑消息)会被保留一段时间,时间长短是可配置的。在这期间,消费者可以看到这个墓碑消息,并且发现它的值已经被删除。于是,如果消费者往数据库里复制kafka的数据,当它看到这个墓碑消息时,就知道应该要把相关的用户信息从数据库里删除。在这个时间段过后,清理线程会移除这个墓碑消息,这个键也将从kafka分区里消息。重要的是,要留给消费者足够多的时间,让他看到墓碑消息,因为如果消费者离线几小时并错过了墓碑消息,就看不到这个键,也就不知道它已经从kafka里删除,从而也就不会去删除数据库里的相关数据了。