При множественных запросах из приложения на Elixir/Erlang, к нашему морфологическому REST сервису написанному на Java/Scala, мы получили множественные задержки ответа для очередного клиента.

Проблема:

  • Вызывает ошибки на стороне клиента, во время прохождения им очереди задач.

Технологии:

  • BACKEND: JVM + SCALA + AKKA + FREELING
  • Brokers: Redis, RabbitMQ
  • FRONTEND: Elixir + Erlang

Пожелания:

  • Желательно действовать по принципу FIRE AND FORGET(зажечь и забыть), чтобы не провоцировать возникновение подобных ошибок.

Решения:

  1. Использование Redis PubSub для межсервисной коммуникации.
    Удобно, если у вас уже имеется пул pubsub построенный на Redis. Таким образом вы можете оповещать результатом сразу все клиентские машины, простым push из рабочей машины в Redis PubSub.
  2. Redis RPUSH для оповещения/контроля рабочих машин.
    Подходит только в случае отсутствия варианта №3, поскольку несет за собой временные издержки на написание/отладку кода, возможные издержки по возможностям, по сравнению с Rabbit.
    Плюсы, возможно будет быстрее чем Rabbit.
  3. Использование RabbitMQ в качестве мессенджера для оповещения/контроля рабочих машин.
    Нашли данный вариант золотой серединой среди прочих. Rabbit контролирует наши рабочие машины.
    Таким образом мы не привязаны к какой-либо из рабочих машин и у нас нет нужды иметь load balancer для них. При этом мы получаем качественный брокер сообщений для пула рабочих машин.
  4. Увеличение TIMEOUT (лимит максимальной задержки)
    Плохой вариант, откладывает проблему на время, поскольку рабочие машины могут отказать в ответе, тогда все-равно придется как-то учитывать данный факт.
    Остается привязка к одной из рабочих машин или их load balancer’у.