Назад | Перейти на главную страницу

Как заблокировать одновременный доступ к общему веб-сервису с нескольких веб-серверов?

Наша производственная среда состоит из n веб-серверов Apache, к которым браузеры получают доступ через фронтальный балансировщик нагрузки. Очень типично. 99% наших HTTP-запросов без проблем обрабатываются этой параллельной архитектурой.

К сожалению, 1% запросов, обрабатываемых Apache, требует доступа к веб-сервису SOAP уровня на внешнем сервере, который абсолютно неспособен обрабатывать параллелизм, что приводит к множеству критических ошибок.

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

Реализуют ли такие очереди стандартные прокси, такие как Pound, Nginx, Squid или Varnish?

У Amazon есть услуга, которой вы могли бы воспользоваться. Это называется Simple Queue Service. http://aws.amazon.com/sqs/

Вы можете использовать это, чтобы ставить задания в очередь и выбирать их из очереди по одному.

Когда сообщение получено, оно блокируется на время обработки. Это предотвращает одновременную обработку сообщения другими компьютерами. Если обработка сообщения завершится неудачно, срок блокировки истечет, и сообщение снова станет доступным. В случае, когда приложению требуется больше времени для обработки, таймаут «блокировки» можно изменить динамически с помощью операции ChangeMessageVisibility.

Есть несколько альтернатив, которые подойдут для вашего варианта использования:

Redis может быть решением такой проблемы. Как это обрабатывает атомарные операции.