Совместное использование логики разделения между производителями полиглотов с Kafka
Мы строим систему для организации мероприятий в моей компании, опираясь на Kafka.
Чтобы соответствовать требованиям GDPR, мы должны иметь возможность обновлять события.
Наша идея - использовать возможности уплотнения и надгробия.
Это означает, что мы не можем использовать стратегию разделения по умолчанию, так как мы хотим, чтобы каждое сообщение имело уникальный ключ (для перезаписи определенного сообщения), но мы все же хотим, чтобы события, происходящие в том же агрегате, заканчивались в том же разделе.
Что приводит нас к созданию пользовательского разделителя (в основном копирование логики "hash modulo" разделителя по умолчанию, но с использованием значения, отличного от ключа сообщения, для вычисления хеша).
Проблема в том, что мы развиваемся в среде полиглотов (у нас есть сервисы php, python и Java/Kotlin, которые публикуют и используют события).
Мы хотим убедиться, что все эти службы будут отправлять сообщения в один и тот же раздел с указанием определенного ключа раздела (в случае, если разные службы будут публиковать события в одной и той же теме).
Наша основная идея состояла в том, чтобы использовать общий алгоритм хэширования, но нам трудно найти его с надежной гарантией распределения и хорошей стабильностью (а не просто частью экспериментальной библиотеки).
PHP изначально поддерживает широкий спектр алгоритмов хеширования, но нам трудно найти такую же поддержку в других языках.
Так как стандартный разделитель Kafka основан на murmur2, мы также начали смотреть в этом направлении. К сожалению, он изначально не поддерживается php (хотя некоторые реализации существуют). Кроме того, этот алгоритм использует начальное число, а это означает, что нам нужно будет использовать одно и то же начальное число для всех наших издательских услуг, что делает этот подход довольно сложным.
Тем не менее, мы могли бы смотреть на дизайн под неправильным углом. Совместное использование возможностей записи в хранилище событий через сервисы полиглотов может быть не очень хорошей идеей, и у каждого сервиса может быть своя собственная логика секционирования, если она обеспечивает требование "один раздел на агрегат". Дело в том, что мы должны думать об этом заранее, потому что никакая техническая защита не помешает одной службе в будущем публиковать в "общем" потоке событий (и неиспользование точно такой же логики секционирования окажет огромное влияние, когда это произойдет).
Будет ли у кого-то опыт создания магазина событий с Kafka в среде полиглота, и не могли бы вы рассказать нам об этой конкретной теме, пожалуйста?