ZeroMQ / NetMQ: PushSocket.SendFrame не работает
Я пытаюсь отправить сообщение типа "забей и забудь" с помощью NetMQ. Меня не волнует ожидание ответа. Это для ведения журнала, и меня больше интересует производительность, чем уверенность в том, что мое сообщение было получено, и я особенно не хочу, чтобы мое веб-приложение зависало, если сервер ведения журнала не работает. Этот код клиента находится в приложении веб-API, если это имеет значение.
У меня есть следующий код на моем клиенте веб-API:
using (var client = new PushSocket(">tcp://localhost:9001"))
{
client.SendFrame("hello!");
System.Threading.Thread.Sleep(10);
}
Этот код работает. Но если я пропущу Thread.Sleep, сервер никогда не получит сообщение. Как правильно это сделать? Я предполагаю, что это не Thread.Sleep.
2 ответа
ZeroMQ (и я предполагаю, что NetMQ) вызовы send являются асинхронными и возвращаются до того, как сообщение отправлено на базовый сетевой уровень. Когда будет достигнут последний символ '}, ваш сокет будет уничтожен, а все еще не отправленные сообщения будут потеряны. Сон останавливает сокет от разрушения достаточно долго, чтобы позволить сообщение быть отправленным.
В идеале вы хотите создать где-нибудь один сокет и использовать его многократно, что будет быстрее и избавит вас от необходимости спать.
Я не эксперт по C#, так что, как бы вы это сделали, мне неизвестно.
Без Tread.sleep ваш сокет будет уничтожен до того, как его можно будет отправить. В зависимости от остальной части вашего приложения, вы можете рассмотреть возможность сохранения сокета в активном состоянии, используя его как объектно-ориентированный сокет.
public class foo
{
PushSocket client;
public foo()
{
client = = new PushSocket(">tcp://localhost:9001);
client.SendFrame("hello!");
}
}
Сокет не будет уничтожен, пока этот экземпляр foo остается живым. Таким образом, ваше сообщение будет получено