大型的 PHP應用 ,通常使用什麼應用做 消息隊列 的?

一直在用Redis 做消息隊列,忽然想到,會不會有更好的呢?


感覺這個問題和 PHP 沒啥關係?消息隊列選型更多考慮業務的場景:

* 性能,比如每秒有多少消息啊,如果你每秒有幾萬的消息量,那 Beanstalk、RabbitMQ 之列的就不能拿來直接用了。
* 可靠性,消息是否允許丟失?是否需要持久化?
* 高可用,是否可以容忍宕機?
* 是否需要分散式
* 運維成本,你們公司的開發(運維)是否有能力維護好這個消息隊列
* 客戶端支持,這個才是語言層面的東西。比如 Kafka 是個很好的消息隊列,但是他的 PHP 客戶端寫的不太好,自己重新寫也比較難,那麼在選型的是否就要慎重。

在權衡這些因素以後,才能決定如何選擇。
有哪些消息隊列: Message queue
性能對比:http://bravenewgeek.com/dissecting-message-queues/


Redis可以用有序列表list這個數據結構實現隊列,lpush入隊,rpop出隊,左進右出.

需要的話,開啟AOF日誌實現數據持久化:

appendfsync everysec 或 appendfsync always

另外,PHP的array_push和array_shift也能模擬隊列(先進先出)實現入隊和出隊:

& "b",
1 =&> "c",
2 =&> "d",
)

SPL隊列SplQueue:

隊列(Queue)-Swoole-Swoole文檔中心

PHP的SPL隊列SplQueue的性能比array模擬的隊列更好.

在一個大並發的伺服器程序上,建議使用SplQueue作為隊列數據結構.

&push($in); // 入隊(enqueue)
$out = $queue-&>shift(); // 出隊(dequeue)
echo count($queue); // 隊列長度
var_export($queue); // SplQueue::__set_state(array())

也就是說,PHP運行在內存常駐的模式下,比如Swoole模式,可以用內置的array或SplQueue實現簡單的隊列存儲.


用redis,rabbitmq這兩個


不如你先指出現有方案有哪些方面不不夠好。


這個要看你的應用場景,一般來說用redis比較簡單,但是redis不能實現消息沒有正常處理,其他進程仍然能夠處理這個消息的情況,也就是沒有對消息有一個處理完成確認的過程。
如果要完整的消息隊列,用過的有:gearman,rabbitmq, 都是不錯的。


php-resque


gearman。如果要求跨網路不丟消息還可以選擇kafka


redis,rabbitmq


workerman


如果是單純做隊列服務建議beanstalkd(小巧、性能好),如果考慮到高可用、海量可以用kafka。


我用過rabbitmq


我們用beanstalk,qps1000左右


看不懂,這個消息列隊是指什麼??


推薦閱讀:

PHP 與 NodeJS 如何共用 Session?
是不是收到了1G的http post數據,這個進程佔用的內存就會有1G?
你怎麼用最通俗的話解釋AJAX是什麼東西?
PHP 的極限在哪裡?
kindeditor編輯器保存的文章帶html標籤,進行文章關鍵詞搜索如何排除標籤內容干擾?

TAG:Web開發 | PHP | 消息隊列 |