Redis + Raspbery PI ตอนที่ 2

หลังจากเราได้สร้างสภาพแวดล้อมการทำงานมาในบทความก่อนหน้านี้แล้ว ในตอนนี้เราจะกล่าวถึงการสร้างระบบ รับ-ส่งข้อความสั้น  (instant messaging) อย่างง่ายกัน

จากข้อมูลของ Redis (http://redis.io/documentation) ก็จะเห็นว่าเราสามารถใช้งาน Redis  ได้หลากหลายทีเดียว แต่ที่เราจะให้ความสนใจกันในที่นี้คือ Redis Pub/Sub (http://redis.io/topics/pubsub) ครับ หากท่านเลื่อนหน้าจอไปยังด้านล่างของหน้าเว็บเพจ ก็จะได้เห็นตัวอย่าง application (https://gist.github.com/pietern/348262) ที่สร้างเป็นระบบ Chat Room ไว้ด้วย ซึ่งเขาใช้ Ruby ในการพัฒนา ในบทความนี้ผมจะย่อเอามาเพียงสั้น ๆ และสร้างใหม่ด้วยภาษา Python ครับ

สถาปัตยกรรม

 ขั้นตอนมาตรฐานในการสร้างระบบ Instant Messaging ด้วย Pub/Sub คือ ต้องมี
1.Publisher หรือผู้ส่งสาร
2. Subscriber หรือ ผู้ส่งสาร
3. Broker หรือตัวกลาง





ส่วนที่ทำหน้าที่เป็น Broker เราก็ได้ทำการติดตั้งไปเรียบร้อยแล้วซึ่งก็คือ Redis Server ครับ ที่เหลือก็เป็นขั้นตอนการสร้าง Publisher และ Subscriber นั่นเองครับ โดยผมสร้าง Flow Chart ดังภาพ

การทำงานของ Publisher



การทำงานของ Subscriber

ต่อไปเราก็จะแปลง Flow Chart ให้เป็นภาษา Python กัน

 Publisher.py :

import redis

broker = redis.Redis(host='localhost',port=6379)

publisher_name = "My Name"

publisher_channel = "My Channel"


stop_flag=False


while not stop_flag :

   msg=raw_input("Enter message: ")

   if msg.lower() == 'exit' :

     stop_flpg=True

   msg = "%s says %s "  % (publisher_name,msg)

   broker.publish(publisher_channel,msg)


อธิบาย

1. เริ่มต้นด้วยการนำเข้า redis เข้ามาในโปรแกรม
2. จากนั้นเราก็สร้างตัวแปรชื่อ broker ขึ้นมาเพื่อใช้ในการติดต่อกับ Redis Server ในตัวอย่างนี้เราใช้ host='localhost' เพราะว่าทุกอย่างอยู่เป็นเครื่องคอมพิวเตอร์เครื่องเดียวกัน และ port = 6379 ซึ่งเป็น default port ของ Redis server
3. ทำการวนรอบเพื่อรับข้อมูลจากผู้ใช้ แล้วส่งให้ broker ทำการ publish ออกไป ขอให้สังเกตุว่า การ publish ข้อมูลจะใช้ตัวแปรสองตัวคือ channel และตัวข้อมูล (msg)


Subscriber.py

import redis

broker = redis.Redis(host='localhost',port=6379)

#create PubSub instance
pub_sub = redis.pubsub() 

publisher_channel = "My Channel"
pub_sub.subscribe(publisher_channel)


stop_flag=False


while not stop_flag :

   try:

      for item in pub_sub.listen() :

         print item['data']

   except KeyboardInterrupt :
      stop_flag = True 

อธิบาย
โปรแกรมในส่วนนี้จะมีความแตกต่างจาก Publisher ตรงที่
1. กำหนดตัวแปร pub_sub เพื่อให้เป็น PubSub instance ด้วยคำสั่ง redis.pubsub()
2. ทำการ subscribe ไปยัง channel ที่ต้องการ ซึ่งต้องตรงกับ channel ในโปรแกรม Publisher
3. วนรอบเพื่อคอยรับข้อมูลจาก Redis server ด้วยคำสั่ง pub_sub.listen() ในขั้นตอนนี้ redis จะทำการกรองเอาแต่ข้อมูลที่ตรงกับ channel ที่สมัครไว้มา
4. ทำการแสดงข้อมูล  item['data']

เพิ่มเติม

ขอให้สังเกตุว่า host ที่ใช้นั้นเป็น localhost ซึ่งในตัวอย่างนี้ ผมได้ติดตั้งทุกอย่างอยู่บน Raspberry PI เครื่องเดียวกัน เพื่อให้เกิดความเข้าใจเท่านั้น ในกรณีที่เราต้องการให้มีการทำงานแบบ Master / Slave ที่แยกเครื่องกัน เราจำเป็นต้องทำการกำหนด address ให้กับ Redis server ใหม่ โดยการไปแก้ไขใน /etc/redis/redis.conf ให้ไป bind กับ address ที่เรากำหนด การกำหนด address แบบนี้ส่ิงที่ได้มาคือเราสามารถเชื่อมต่อกับ redis server ได้จากเครื่องอื่น แต่ก็ต้องระวังเรื่องความปลอดภัยไว้ด้วย คือเราควรมั่นใจว่าเครื่องคอมพิวเตอร์ที่จะมาเชื่อมต่อกับ resdis server นั้นเป็นเครื่องที่ไว้ใจได้จริง  หรือควรพิจารณาเรื่องระบบความปลอดภัยแบบอื่นร่วมด้วย ครับ สำหรับระบบการรักษาความปลอดภัยเบื้องต้น ติดตามได้ในตอนที่สามครับ

ความคิดเห็น