NetMQ Как обнаружить медленных подписчиков с помощью опции HighWatermark и отключить их от издателя? - PullRequest
0 голосов
/ 06 февраля 2020

Я просто задаю задержку перед тем, как подписчик прочитает следующий кадр, поэтому я ожидал, что это симулирует медленного подписчика и даст некоторые эффекты опции HighWatermark. Я ничего не наблюдаю, подписчик не пропускает ни сообщения, ни замедляет работу издателя. Я запустил 1 издателя и х подписчиков.

Я пытаюсь поиграть с примером pub-sub, взятым из документации https://netmq.readthedocs.io/en/latest/pub-sub/

Есть ли способ обнаружить, что подписчик работает медленно? Я имею в виду, что количество сообщений в очереди превысило значение HighWatermark. Стоит ли ожидать каких-либо исключений или событий в NetMqMonitor? Я также смотрю, есть ли возможность отключить такого медленного абонента.

using System;
using System.Threading;
using NetMQ;
using NetMQ.Sockets;

namespace Sub
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Subscriber started for Topic : {0}", topic);
            using (var subSocket = new SubscriberSocket())
            {
                subSocket.Options.ReceiveHighWatermark = 100;
                subSocket.Connect("tcp://localhost:12345");
                subSocket.Subscribe("topic1");
                Console.WriteLine("Subscriber socket connecting...");
                while (true)
                {
                    string messageTopicReceived = subSocket.ReceiveFrameString();
                    string messageReceived = subSocket.ReceiveFrameString();
                    Console.WriteLine($"{messageTopicReceived} {messageReceived}");
                    Thread.Sleep(50);
                }
            }
        }
    }
}
using System;
using System.Threading;
using NetMQ;
using NetMQ.Sockets;

namespace Pub
{
    class Program
    {
        static void Main()
        {
            using (var pubSocket = new PublisherSocket())
            {
                Console.WriteLine("Publisher socket binding...");
                pubSocket.Options.SendHighWatermark = 100;
                pubSocket.Bind("tcp://*:12345");
                Thread.Sleep(1000);
                for (var i = 0; i < 100000; i++)
                {
                    var msg = "msg-" + i;
                    Console.WriteLine("Sending message : {0}", msg);
                    pubSocket.SendMoreFrame("topic1").SendFrame(msg);
                    //Thread.Sleep(1);
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 25 февраля 2020

NetMqMonitor не вызывает события, указывающие на то, что некоторые сообщения были отброшены. Абонент должен проверить время генерации и решить сам, что делать. http://zguide.zeromq.org/php: глава 5 # Медленное обнаружение подписчика-самоубийство-улитка

Ps. Чтобы наблюдать эффект ReceiveHighWatermark, пример кода из вопроса должен быть модифицирован. Сообщения были слишком маленькими.

...