Tuesday, August 26, 2008

rabbiter

@sugree tweet ถามถึง Rabbiter, ด้วยความที่ไม่รู้ว่ามันคืออะไร ก็เลยต้องไปหาข้อมูลมาอ่านก่อน

เป้าหมายของเจ้า rabbiter ก็คือ
using XMPP to build a decentralized microblogging platform (think Twitter busted apart to run as a distributed network of microblogging providers)

หลักการทำงาน


เจ้า rabbitter จริงๆแล้วก็คือ module extension ของ ejabberd โดยมันจะประพฤติตนเป็น bot คอยโต้ตอบกับเรา
หน้าที่ของมันก็คือการ relay message ของคนอื่นๆที่เราสนใจ (follow) มาให้เรา หรือ ส่งต่อข้อความของเรา ไปให้กับคนอื่นที่สนใจติดตามเรา (follower)
โดยการ relay นี้สามารถทำข้ามวง ejabberd server ได้
ในแง่ architecture ประเด็นที่น่าสนใจก็คือ มันใช้ messageing queue (rabbitmq) เข้ามา handle publisher-subscriber model.
อ่านเอกสารอธิบายอย่างละเอียดได้ที่นี่
https://dev.rabbitmq.com/wiki/RabbiterFederation

วิธีการ install


  • ติดตั้ง erlang, เนื่องจาก erlang compile ได้ง่ายๆ ดังนั้นใช้วิธี download source code มา compile เองดีกว่า
    version ที่ผมใช้ก็คือ r12-b3
  • ติดตั้ง rabbitemq-server
    ตัวนี้ให้ download source version 1.4.0 มา เวลา compile ก็แค่สั่ง make เป็นอันเสร็จพิธี
  • ทำให้ erlang มองเห็น rabbitmq-server module
    ถ้าเราติดตั้ง erlang ด้วยการ compile code เอง, modules path ของ erlang จะอยู่ที่ /usr/local/lib/erlang/lib
    โดยมีหน้าตาประมาณนี้

    pphetra@[/usr/local/lib/erlang/lib]
    $ ls
    appmon-2.1.9 dialyzer-1.8.1 mnesia-4.4.3 ssl-3.9
    asn1-1.5.2 docbuilder-0.9.8.4 observer-0.9.7.4 stdlib-1.15.3
    common_test-1.3.2 edoc-0.7.6 orber-3.6.9 syntax_tools-1.5.5
    ...

    ให้ทำ symbolic link กับ directory rabbitmq-server-1.4.0
    Note: ตรงนี้ให้ระวังชื่อด้วย เพราะ code ของ rabbiter มันต้องการให้เป็นชื่อ rabbitmq_server เป๊ะๆ

    $ ls -l rab*
    lrwxr-xr-x 1 root pphetra 40 Aug 27 13:05 rabbitmq_server -> /Users/pphetra/dev/rabbitmq-server-1.4.0

  • ขั้นถัดไปก็ clone เจ้า rabbiter จาก github
    Note: ใครที่สั่ง clone แล้วเกิด error timeout ให้ลองเปลี่ยน url จาก git://github.com/tonyg/rabbiter.git
    เป็น http://github.com/tonyg/rabbiter.git
    เมื่อได้มาแล้ว ก็ทิ้งไว้ก่อน เดี๋ยวเราจะไปฝาก compile กับ ejabberd
  • ติดตั้ง ejabberd, ตัวนี้ให้ใช้ version 2.0.1
    ก่อน compile ก็ให้ไปแอบทำ symbolic link เจ้า file mod_rabbiter.erl เข้ามาใน directory ejabberd-2.0.1/src เสียก่อน
    (หรือจะเล่นลูกทุ่ง copy เอาดื้อๆ ก็ไม่ผิด)
  • config ejabberd ให้รู้จัก rabbiter
    โดย edit /etc/ejabberd/ejabberd.cfg
    เพิ่ม บรรทัดนี้ลงไป

    {modules,
    [
    {mod_adhoc, []},
    {mod_announce, [{access, announce}]}, % recommends mod_adhoc
    {mod_caps, []},
    ...
    {mod_rabbiter, []},
    ...



การทดสอบ


  • สั่ง start ejabberd ด้วยคำสั่ง /sbin/ejabberdctl start
    ตรวจสอบว่า start สำเร็จหรือไม่ ด้วยคำสั่ง /sbin/ejabberdctl status

    $ ./ejabberdctl status
    Node ejabberd@localhost is started. Status: started
    ejabberd is running

  • add user

    $ ./ejabberdctl register pphetra localhost mypassword
    $ ./ejabberdclt register sugree localhost anypassword

  • ทดลองใช้ IM ต่อเข้ามา โดยระบุตัวตนเป็น pphetra
    จากนั้นก็ add contact rabbiter@rabbiter.localhost
    ลองสั่ง *help ก็จะได้ message แบบนี้

    To give me a command, choose one from the list below. Make sure you prefix it with '*', otherwise I'll interpret it as something you want to send to your group of followers. You can say '*help (command)' to get details on a command you're interested in. If you want to actually say 'help', rather than asking for help, type '*say help' instead.
    ["*help","*follow","*unfollow","*following","*followers",
     "*invite"]

    ลองสั่ง *follow sugree@localhost ก็จะได้รับ message แบบนี้

    You are now following sugree@localhost.

    Note: user sugree ต้องเคย logon ก่อนด้วย IM client ไม่งั้น จะได้ error เป็นแบบนี้

    I don't know that person. Perhaps you could invite them to get in touch?


Note: ตอนทดสอบต้องระวังประเด็นที่ IM client แอบแก้ message ของเรา เช่น pidgin บน linux, ที่เวลาเราสั่ง *follow x@y มันจะแอบเปลี่ยนเป็น *follow x@y <mailto:x@y> ซึ่งส่งผลให้ rabbiter ไม่รู้จักคำสั่งนี้

Related link from Roti