Redis Cluster vs ZeroMQ в Pub/Sub, для распределенных систем с горизонтальным масштабированием
Если бы я спроектировал огромную распределенную систему, пропускная способность которой должна линейно масштабироваться в зависимости от количества подписчиков и количества каналов в системе, что было бы лучше?
1) Redis Cluster (только для Redis 3.0 alpha, если он находится в режиме кластера, вы можете опубликовать на одном узле и подписаться на другом совершенно другом узле, и сообщения будут распространяться и доходить до вас). Сложность публикации - O (N + M), где N - количество подписанных клиентов, а M - количество подписанных шаблонов в системе, но как оно масштабируется в Redis Cluster? Я принимаю обоснованные догадки по этому вопросу.
2) ZeroMQ начиная с 3.x, он выполняет фильтрацию на стороне сервера, поэтому он также имеет некоторую сложность во времени, но я ничего не видел в документации. Если бы я хотел масштабировать его, я мог бы просто иметь множество серверов, публикующих любые каналы, и каждый подписчик подключался бы ко всем серверам и подписывался на нужный канал. Это кажется хорошим.
Так что же лучше для горизонтального масштабирования огромной системы издателей? Какие еще решения я должен рассмотреть? Помните, я хочу минимизировать задержку и пропускную способность, но возможность масштабировать горизонтально.
2 ответа
Вы хотите минимизировать задержку, я думаю. Количество каналов не имеет значения. Основными факторами являются количество издателей и количество подписчиков, размер сообщения, количество сообщений в секунду на издателя, количество сообщений, полученных каждым подписчиком, примерно. ZeroMQ может делать несколько миллионов маленьких сообщений в секунду от одного узла к другому; Ваше узкое место будет в сети задолго до того, как появится программное обеспечение. Поэтому в большинстве высокопроизводительных архитектур pubsub используется что-то вроде PGM multicast, которую поддерживает ZeroMQ.
В Redis, как и в ZeroMQ, узким местом будет сеть. Redis может достигать миллионов сообщений в секунду, по крайней мере, столько же, если не больше, чем ZeroMQ.
Вы должны знать, что текущая реализация Redis Cluster распределяет сообщения PUBLISH по всем узлам кластера с использованием межузловой шины. Этот подход предполагает, что PUBLISH очень дешев на Redis (как описано в этом выпуске на Github).
Тем не менее, существует небольшая служебная нагрузка, которая заключается в межузловой связи. По мере увеличения масштабов эти накладные расходы будут более значительными. Мне известна другая реализация Redis Cluster - обратите внимание, что это коммерческая реализация, в которой каналы или шаблоны распределяются по узлам кластера аналогично тому, как распространяются ключи Redis. По крайней мере, по словам поставщика, это должно сэкономить накладные расходы на межузловую связь и повысить производительность, но я сам не тестировал ее.