Cassandra пишет дросселирование с несколькими клиентами
У меня есть два клиента (отдельные док-контейнеры), оба пишут в кластер Cassandra.
Первый - это запись данных в реальном времени, которые поступают со скоростью, с которой может справиться кластер, хотя и с небольшим запасом емкости. Это считается высокоприоритетными данными, и мы не хотим отбрасывать их. Скорость проглатывания варьируется от минуты к минуте. Иногда данные резервируются в очереди, из которой клиент читает, а в других случаях клиент очищает очередь и (кратко) ожидает получения дополнительных данных.
Вторым является массовый дамп данных из интернет-магазина. Мы хотим записать его в Cassandra как можно быстрее со скоростью, которая поглощает любую свободную емкость, существующую после записи данных в реальном времени, но без того, чтобы кластер начал выдавать тайм-ауты.
Используя драйвер Python DataStax и сохраняя два клиента раздельными (то есть им не нужно знать или взаимодействовать друг с другом), как я могу ограничить запись со второго клиента так, чтобы он максимизировал пропускную способность записи при условии отсутствия влияния пропускная способность записи первого клиента?
1 ответ
Решение, которое я придумал, состояло в том, чтобы заставить обоих производителей данных писать в одну и ту же очередь.
Чтобы выполнить требование, чтобы объемные данные с низким приоритетом не мешали оперативным данным с высоким приоритетом, я заставил производителя данных с низким приоритетом проверить длину очереди, а затем добавить запись в очередь, только если длина очереди ниже подходящего порога (в моем случае 5 сообщений).
В результате ни одно сообщение с живыми данными не может иметь более 5 массовых сообщений с данными перед ним в очереди. Если сообщения начинают выполнять резервное копирование в очереди, тогда производитель массовых данных прекращает помещать в очередь больше данных, пока длина очереди не опустится ниже порогового значения.
Я также разделил объемные данные на множество небольших сообщений, чтобы потребитель относительно быстро их обрабатывал.
У этого подхода есть три недостатка:
- Нет никакой информации о том, сколько сообщений в очереди имеет низкий приоритет, а сколько - с высоким приоритетом. Однако мы знаем, что не может быть более 5 сообщений с низким приоритетом.
- Производитель сообщений с низким приоритетом должен опросить очередь, чтобы получить текущую длину, что создает небольшую дополнительную нагрузку на сервер очереди.
- Порог не применяется строго потому, что между двумя производителями идет гонка от проверки длины очереди до постановки в очередь сообщения. Это несерьезно, потому что производитель с низким приоритетом ставит в очередь только одно сообщение, когда проигрывает гонку и в следующий раз узнает, что очередь слишком длинная и ждет.