What have you found for these years?

2010-03-15

use the source, amqp

有點無言,抽象 spec 看半天不知所以然,
介紹文章又都寫得太囉嗦搔不到癢處,
直接看 example 又感到很困惑,
翻文件又覺得很沒頭沒腦........

剛剛終於受不了去翻 source, 果然解除了大部份的困惑 orz

一言以蔽之,amqp 這個 ruby gem, 加了一堆方便的作法,
因此搞到很多種作法都行,意思都一樣。但光看 example 和
文件,根本無法辨認是否一樣...

呃這樣用起來方便當然好,不過對於毫無概念要入門的我,
就被他搞得暈頭轉向。搞不清楚到底這些看起來很像的東西,
到底有什麼差?為什麼歸納出一個規則出來,又有許多例外...

簡單地說,他的 MQ 就是最大的 wrapper.
寫 MQ.queue 就是 MQ.default.queue
這個 default 是 thread local queue...
因此有的地方寫 MQ.new.queue, 有的寫 MQ.queue,
差在後者是 thread local.

他裡面一堆地方都是可以直接從底層建立,
或是你什麼都不用給,他就用預設的東西生給你。
我很困惑為什麼 MQ.new.queue 可以直接 subscribe,
但明明文件就說任何一個 queue 都需要至少一個 exchange?

答案是如果什麼 exchange 都沒設,預設有一個 direct exchange.
其中 fanout, topic, headers, 也都是特殊的 exchange.
因此不是有時候可以不要 exchange, 有時候又不用...
只是沒有的時候,他常常會生給你。就像你直接寫
MQ.new 卻沒寫 connect 不是很奇怪?因為他會生給你。
幾乎什麼東西都能省略,他就都用預設的東西生給你。

老實講這樣用起來真的是很方便。只是他程式內部會不好做,
會有很多 circular reference...
想到這裡,就在想或許 ruby 簡單好用就是因為 very
stateful, reference 可以讓你亂指一通...
當然這也意味著容易寫出亂七八糟的程式啦(遠目)

總之可以把 exchange 看成 sender 的 server,
而把 queue 看成 receiver 的 server,
然後 exchange 和 queue 之間可以任意 bind 起來,
大概就是這樣而已。example 用法太豐富,
從那邊去歸納真的很容易被搞混。

結論就是一律用他的 MQ wrapper 就好了,他包得很好。
照原本 AMQP 那樣要定義一堆東西的話,寫起來會很煩。
只是還是要搞清楚,不然用起來會非常困惑...
還滿佩服他怎麼能把這麼糾結的結構寫得這麼乾淨。
amqp 全部程式也沒幾行,也是寫得很漂亮的一個,有機會可以讀讀看。
可以丟掉亂七八糟的 stomp 也真是太好了(灑花)

==
下次要來列列看到會想翻桌的 ruby gem,
還有看了很欽佩想模仿的 ruby gem...

rails 當然是想翻桌的頭號人物 XD
rails plugin 全略,大部份都亂七八糟。
stomp, rubycas-server, facebooker, ...

厲害的,unicorn, mogilefs-client,
eventmachine, amqp, thin, ramaze, innate,
想想其實也還滿多的?

0 retries:

Post a Comment

All texts are licensed under CC Attribution 3.0