Есть ли простой способ разделить задания на различные серверы Redis, используя Hangfire с Redis, с помощью хэшей ключей?

В настоящее время мы используем Hangfire с MSSQL и хотели бы повысить производительность наших задач, перейдя на Redis.

Шардинг (разбиение) по хешу ключа очень прост, масштабируем и легок в обслуживании. В настоящее время у нас нет доступа к кластерам Redis. Итак, есть два требования, которые мы хотели бы выполнить:

  • Передайте список серверов Redis в Hangfire через файл конфигурации.
  • Перенести любой заданный ключ на любой из серверов предсказуемо (аналогично Memcached)

Таким образом, мы могли бы распределить любое количество заданий между n-ю серверами Redis.

Я понимаю, что Hangfire состоит из двух частей: хранилища и рабочих мест. Мне любопытно, как эти два компонента будут работать в среде с сегментированием Redis.

Я понимаю, что сторонние компоненты, такие как Twemproxy, помогают в решении этих проблем, но, поскольку подход к хешированию ключей настолько прямолинеен, я подумал, что исчерпаю все возможности до внедрения Twemproxy.

Спасибо!


person BlackjacketMack    schedule 18.06.2015    source источник


Ответы (1)


Вы правы в различении двух частей Hangfire: движок ничего не знает о хранилище и наоборот.

Сбор заданий из хранилища осуществляется с помощью механизмов блокировки:

Когда запускается Hangfire, он запускает столько потоков, сколько настроено (Номер рабочего). Затем каждый воркер спрашивает хранилище, есть ли задания, которые нужно обработать, переводя их в состояние обработки. ЭТА операция должна выполняться с использованием какого-то механизма блокировки.

Как реализована эта блокировка, зависит от самого хранилища, я считаю, что на SQL Server хранилище использует операторы SQL UPDATE MERGE, тогда как официальная версия Redis использует команды блокировки (BRPOPLPUSH и подобные), в то время как другие, подобные моей, используют механизм Redis Publish-Subscribe .

Переходя к вашим требованиям, я могу рассказать о этой реализации Redis

  • Список серверов Redis передается в хранилище через строку подключения к хранилищу, например "redis0:6380,redis1:6380,allowAdmin=true" (см. эту страницу для подробностей)
  • Насколько мне известно, клиент Redis поддерживает кластер Redis и работает, разделяя ключи и позволяя клиенту подключиться к правильному экземпляру Redis

Я использую реплицированный сервер Hangfire с Redis в производстве, но я использую только отработку отказа Redis master-slave, а не Redis Cluster

person mCasamento    schedule 24.06.2015
comment
Очень информативно, спасибо. Чтобы упростить ответ: если вы даете несколько серверов в соединении Redis, он должен автоматически сегментировать записи ключей. Если это подтвердится (попробую позже), я отмечу это как принятый ответ. Спасибо! - person BlackjacketMack; 24.06.2015
comment
Сам не пробовал, но думаю, что да. В любом случае, может быть, этот вопрос SO может быть полезен stackoverflow .com / questions / 23180765 / - person mCasamento; 24.06.2015