ส่ง message ข้าม process ด้วย NetMQ (ZeroMQ)

blog-netmq

NetMQ เป็นไลบรารีในการส่ง message ข้ามโพรเซส (process) เพื่อแลกเปลี่ยนข้อมูล มีหลายวิธีในการรับส่ง ทั้งแบบ Request-Response, Publish-Subscribe หรือ Push-Pull ซึ่งในแต่ละภาษาก็จะมีไลบรารีที่ทำงานในลักษณะนี้อยู่

NetMQ นั้นเป็นไลบรารีแบบพอร์ต (native port) จาก ZeroMQ โดยใช้ภาษา C# ในที่นี้ ขอยกตัวอย่างการทำงานแบบ Publish-Subscribe หรือเรียกย่อๆว่า PubSub ซึ่งจะมีโพรเซสที่เป็นผู้ส่งข้อมูล (Publisher) กับ ผู้รับข้อมูล (Subsccriber) โดยจะใช้สื่อกลางคือ Topic เปรียบเทียบได้กับการติดตามข่าวสาร ถ้าเราสนใจหัวข้อใดๆ ก็จะไปติดตามเรื่องนั้นๆ จนกว่าจะหยุดการติดตาม หรือเทียบได้กับการปิดโพรเซสไปนั่นเอง

Topic ก็คือชื่อที่ตกลงกันล่วงหน้าระหว่าง Publisher กับ Subscriber เท่านั้น ซึ่งเราสามารถจะจัดโครงสร้างได้ด้วย เช่น ใช้สแลช ( / ) ในการระบุหัวข้อย่อย ในลักษณะเช่น “Music/Rock” โพรเซสที่ subscribe ที่ Topic “Music” จะได้รับข้อความจาก Publisher ที่ส่งมายัง Topic “Music” และ “Music/Rock”

วิธีการเขียนโปรแกรมก็ไม่มีอะไรซับซ้อนมาก ดังนี้

Publisher

using (var pubSocket = new PublisherSocket())
{
   Console.WriteLine("Publisher socket binding...");
   pubSocket.Bind("tcp://localhost:12345");

   Console.WriteLine("Sending message : {0}", msg);
   pubSocket.SendMoreFrame("Music/Rock").SendFrame(msg);
}

Subscriber

using (var subSocket = new SubscriberSocket())
{
    subSocket.Connect("tcp://localhost:12345");
    subSocket.Subscribe("Music");
    Console.WriteLine("Subscriber socket connecting...");
    while (true)
    {
        string messageTopicReceived = subSocket.ReceiveFrameString();
        string messageReceived = subSocket.ReceiveFrameString();
        Console.WriteLine(messageReceived);
    }
}

จะเห็นว่าต้องจัดลำดับการรับ-ส่ง โดย message แรกจะเป็น Topic หลังจากนั้นถึงจะเป็นเนื้อข้อมูล

ที่มา

สแลช (slash)

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s