Я изучаю RabbitMQ и подумал о том, чтобы использовать его для предоставления пользователям «динамических сообщений», очень похоже на то, как Facebook дает динамические каналы от друзей.
Моя идея была:
Каждый раз, когда создается пользователь, я создаю очередь с именем userId пользователя, поэтому имя очереди может быть «100_message_queue
«(userId_message_queue).
Производитель будет помещать все обновления в эту очередь.
Со стороны клиента (javascript) он будет вызывать REST API, например:GET http://example.com/getliveupdates/100
«, тогда я буду получать все новые обновления от 100_message_queue
и отправьте это как ответ.
Я читаю учебники PHP RabbitMQ, но не могу понять, как это возможно? Более того, потребитель работает вечно, поэтому кажется, что я не могу сделать REST-запрос. Это дает мне тайм-аут.
Есть идеи, как реализовать такую структуру?
Спасибо
Поскольку вы планируете доставлять эти сообщения в веб-клиент, я бы порекомендовал посмотреть на MQTT а также ТОПАЙТЕ с Веб-STOMP Плагины RabbitMQ. Для вас это должно быть идеальным решением использовать их власть над WebSocket. И это дает вам сообщения в реальном времени, который всегда профессионал и, вероятно, то, что вы хотите.
Что касается работы с вечными потребителями:
Если вы используете php-amqp
расширение вы можете установить read_timeout
параметр для некоторых небольших значений, скажем, 1 (сек), поэтому, когда потребитель получит все сообщения из очереди, он будет ждать в течение 1 сек. больше для новых сообщений, а затем выбросить исключение (я думаю, AMQPConnectionException, некрасивое решение, но сейчас это так).
Кроме того, вы можете AMQPQueue::get
сообщения из очереди, пока не останется сообщений.
С php-amqplib
все должно быть одинаково, по крайней мере, идея все та же: ограничить потребителя временем ожидания новых сообщений или итеративным образом получать сообщения из очереди.
Других решений пока нет …