Вопрос

Задний план:Наша текущая система включает в себя два сервиса (один, написанный в Java, другой в PHP), которые взаимодействуют друг с другом с использованием HTTP обратных вызовов. Мы хотели бы перенести из HTTP обратных вызовов в архитектуру на основе сообщений, используя ActiveMQ (или другое, при необходимости). Мы, вероятно, будем использовать Овладеть общаться между ними. В конце концов, служба PHP будет переписана в Java, но это не является частью этого проекта.

Вопрос:Как система ActiveMQ может уведомить PHP, что в очереди была опубликована новое сообщение, чтобы система PHP подписана? В текущей системе обратный вызов по своей природе вызывает в PHP и запускает его. Это уходит с помощью архитектуры на основе сообщений.

Возможные решения:

  • Cron регулярно вызывает сценарий PHP, который проверяет новые сообщения. auck.
  • Длительный процесс PHP процесс, который петли и спит и проверяет новые сообщения. меньше выталкивать?
  • ActiveMQ вызывает сценарий PHP, когда будет опубликовано новое сообщение. Хорошо, как?
  • ??
Это было полезно?

Решение

Проверить Верблюда. Отказ Он может работать внутри ActiveMQ или сам по себе. Верблюд создает «маршруты» для сообщений. В этом случае я бы предположил, что вы покидаете URL-адрес PHP обратного вызова AS, и настройте маршрут в верблюде, который принимает сообщения из очереди и публикует их на URL-адрес обратного вызова. Затем вы можете использовать STOPP в PHP для отправки сообщений на ActiveMQ. Ваш код Java может просто использовать JMS для входящих, так и для исходящих сообщений.

Другие советы

Можете ли вы иметь команды activemq execute Shell? Если это так, просто установите ActiveMQ Script PHP через командную строку всякий раз, когда есть новое сообщение для обработки. Это спасает вас от запуска заданий CRON и имея длинную работу PHP-петли.

Вопрос: Как система ActiveMQ может уведомить PHP, что новое сообщение было размещено в очереди, чтобы система PHP подписана на? В текущей системе обратный вызов по своей природе вызывает в PHP и запускает его. Это уходит с помощью архитектуры на основе сообщений.

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

Я думаю, что проблема, которую они пытаются решить, состоит в том, что стек лампы (из которого является частью PHP), по своей природе привязан к механизму запроса / реакции, который включает в себя силы протокола HTTP, поэтому имея потребительский (проверяющий activeMQ) Написанный в PHP работает работает, но срок службы процессов естественным образом ограничен любым тайм-аутом в протоколе HTTP. Решение одно из:

1 - не запустите абонент PHP внутри Apache / http, и в результате вы можете выполнить set_time_limit (0), и иметь подписчик PHP навсегда (пока он в любом случае не работает), или

2 - осознайте, что подписчик действительно просто делает «периодические» проверки, с большим количеством внутри, поэтому вместо того ,ude (1) {do_queue_Stuff (); спать(); } Вы удаляете сон, удалите цикл While, и повторно называйте его из CRON или аналогичного.

У каждого есть свои преимущества, но оба одинаково хороши, если частота CRON () достаточно настраивается. Мой Крон ограничивается за бегом каждую минуту, что не очень часто, поэтому мне пришлось сделать комбинацию вышеупомянутых: призванные из Cron каждую минуту:

time = what_minute_is_it (); в то время как (what_minute_is_it () == time) {do_queue_Stuff (); сон (1); }

Я думаю, что люди могут быть после того, как этот способ иметь способ иметь систему ActiveMQ «намека» в систему потребителей PHP, которые могут быть в очереди, которые нуждаются в обработке, и в результате сохраняются во всей этой очередной обработке очереди. / etc вещи, если на самом деле ничего не на самом деле делать. Верблюд, кажется, как это сделать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top