Очень часто, когда ко мне приходят разработчики с просьбой добавить новый вариант использования Kafka, они считают, что Kafka может сразу решить все проблемы. Хотя это действительно отличный проект, его также можно несколько упростить до простой абстракции «удаленного массива записей» с некоторыми улучшениями (высокая производительность, группы потребителей, уплотнение, множественные интеграции и т. д.).

Однако на самом деле с разделом Kafka можно просто обращаться так, как он есть — с удаленным массивом байтов, позволяющим выполнять операции записи только для добавления для производителей и произвольный доступ для потребителей.

Итак, немного полегче: если Kafka можно рассматривать как массив байтов, то можно ли будет использовать его в типичных сценариях информатики, таких как двоичный поиск? Оказывается, это вполне возможно, если мы создадим раздел с отсортированными данными, а затем воспользуемся потребителем для доступа к array[i] .

В приведенном выше простом примере мы в основном реализуем наш собственный двоичный поиск и создаем метод anarrayAccess для предоставления нашей реализации array[i] на основе Kafka.

Однако в данном случае нам пришлось реализовать собственный бинарный поиск, а вместо него можно было использовать Collections.binarySearch. Для этого нам нужно будет создать забавный класс KafkaBackedArray, который будет реализовывать метод List get с потребителем — при этом остальная часть API предоставляется нам почти бесплатно.

В конце концов это работает, как и ожидалось, бинарный поиск выполняет доступ, который преобразуется в вызовы Kafka poll.

Внимательные читатели заметят, что я настроил потребителя на использование max.poll.records=1, так как не хотел опрашивать данные только для того, чтобы их выбросить. Нашу реализацию KafkaBackedArray можно было бы сделать немного умнее и использовать некоторый внутренний кеш уже полученных записей, экономя на задержке и сетевом вводе-выводе.