หลังจากเราได้สร้างสภาพแวดล้อมการทำงานมาในบทความก่อนหน้านี้แล้ว ในตอนนี้เราจะกล่าวถึงการสร้างระบบ รับ-ส่งข้อความสั้น (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 ครับ
1.Publisher หรือผู้ส่งสาร
2. Subscriber หรือ ผู้ส่งสาร
3. Broker หรือตัวกลาง
ส่วนที่ทำหน้าที่เป็น Broker เราก็ได้ทำการติดตั้งไปเรียบร้อยแล้วซึ่งก็คือ Redis Server ครับ ที่เหลือก็เป็นขั้นตอนการสร้าง Publisher และ Subscriber นั่นเองครับ โดยผมสร้าง Flow Chart ดังภาพ
การทำงานของ Subscriber
ต่อไปเราก็จะแปลง Flow Chart ให้เป็นภาษา Python กัน
Publisher.py :
2. จากนั้นเราก็สร้างตัวแปรชื่อ broker ขึ้นมาเพื่อใช้ในการติดต่อกับ Redis Server ในตัวอย่างนี้เราใช้ host='localhost' เพราะว่าทุกอย่างอยู่เป็นเครื่องคอมพิวเตอร์เครื่องเดียวกัน และ port = 6379 ซึ่งเป็น default port ของ Redis server
3. ทำการวนรอบเพื่อรับข้อมูลจากผู้ใช้ แล้วส่งให้ broker ทำการ publish ออกไป ขอให้สังเกตุว่า การ publish ข้อมูลจะใช้ตัวแปรสองตัวคือ channel และตัวข้อมูล (msg)
Subscriber.py
อธิบาย
โปรแกรมในส่วนนี้จะมีความแตกต่างจาก Publisher ตรงที่
1. กำหนดตัวแปร pub_sub เพื่อให้เป็น PubSub instance ด้วยคำสั่ง redis.pubsub()
2. ทำการ subscribe ไปยัง channel ที่ต้องการ ซึ่งต้องตรงกับ channel ในโปรแกรม Publisher
3. วนรอบเพื่อคอยรับข้อมูลจาก Redis server ด้วยคำสั่ง pub_sub.listen() ในขั้นตอนนี้ redis จะทำการกรองเอาแต่ข้อมูลที่ตรงกับ channel ที่สมัครไว้มา
4. ทำการแสดงข้อมูล item['data']
จากข้อมูลของ 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']
ความคิดเห็น
แสดงความคิดเห็น