Что касается вашего первого вопроса, NServiceBus, который является коммерческой платформой для .NET, которая абстрагирует транспорт сообщений и добавляет множество функций поверх них, имеет именно ту функцию, которую вы ищете.На самом деле они называют его « callbacks », и его использование выглядит следующим образом:
Предполагая, что у вас есть Сообщение для отправки в бэкэнд-сервис и Ответ, который вы ожидаете вернуть, вы должны сделать, вServiceA:
var message = new Message();
var response = await endpoint.Request<ResponseMessage>(message);
log.Info($"Callback received with response:{response.Result}");
Где конечная точка - это артефакт NServiceBus, который позволяет отправлять сообщения и получать сообщения.
Что этот простой синтаксис будет делать, это помещать сообщение в очередь и ждать (асинхронно)пока сообщение не будет обработано серверной службой и оно не ответит на него.Ответ - это сообщение типа Response в очереди.
В ServiceB вы должны сделать:
public class Handler : IHandleMessages<Message>
{
public Task Handle(Message message, IMessageHandlerContext context)
{
var responseMessage = new ResponseMessage
{
Result = "TheResult"
};
return context.Reply(responseMessage);
}
}
Это позволяет иметь несколько узлов ServiceA, отправляющих сообщения на несколько узлов ServiceB (конкурирующие потребители в одной очереди).NServiceBus заботится о маршрутизации ответа на нужный сервер A для каждого данного сообщения.
Обратите внимание, что это имеет тот недостаток, что, если ServerA отключается во время ожидания ответа, вы никогда не получите ответ.По этой причине этот шаблон не рекомендуется для большинства сценариев.
Что касается вашего вопроса № 2, я бы сказал, что балансировщик нагрузки сделает эту работу.Для более сложных сценариев вы можете посмотреть Service Fabric .