M
M
Matisumi2019-01-02 15:18:33
.NET
Matisumi, 2019-01-02 15:18:33

Microservices on .net - the optimal "communication" protocol?

If we are talking about microservices on the .net/.net core platform, what is the optimal "communication" protocol between them? wcf? web API? XML-/JSON-RPC? RabbitMQ type message broker?
And is it worth bothering with the topic of a single "communication" protocol between all microservices?

Answer the question

In order to leave comments, you need to log in

5 answer(s)
I
Ivan Shumov, 2019-01-02
@inoise

There are only 2 basic principles of communication:
1. Influence on the system (action). This is the API. Typically json REST
2. System response to action (also used as low coupling). These are message queues.
In general, everything depends on the user case and there is no common universal protocol. Many different architectures and all are good in their own way. Personally, I use the REST API everywhere and after any (successful and not) call I send a message to the ESB. If I need to influence another subsystem (for example, after accepting an order, send it to the sales department for confirmation), then I use Consumer to send it to another api.

I
Ivan Filatov, 2019-01-02
@NYMEZIDE

Personally, I use such a scheme from experience:
if, according to business logic, the call was
1. synchronous, then a REST request is used, json. There may be a whole chain of calls.
2. asynchronous - then the event is published to the RabbitMQ bus. One event can then spawn a chain of events.
2.1 sometimes the first calls go to REST - but then the event is published, etc. this option is still considered asynchronous.

N
Nikita Gusev, 2019-01-02
@nguseff

Depends on what kind of "communication" occurs between services.
To receive data from other services, it is logical to use REST.
If we are talking about publishing events, then it is logical to use queues (for example, you need to recalculate aggregates when updating data).
If we are talking about distributed transactions, then there are queues and sagas (architectural pattern). You need a separate service that will coordinate transaction steps, handle failures, etc. I advise you to look at such a project for .NET as MassTransit.
It is also worth considering the issue of logging and tracing so that you can get all the logs of a specific user request from all microservices.

A
abbaboka, 2019-01-14
@abbaboka

"Смешались к кучу люди, кони...."
RabbitMQ и пр. MQ всего лишь посредник. Их задача - удобно доставлять информацию. Что там будет внутри сообщения - другой вопрос.
Заморачиваться едиными правилами/единым форматом для протокола - стоит, да.
В наше время для мелких проектов - скорее JSON, HTTP.
Для крупных проектов лучше что-то более строгое и формализованное Protobuf, XML.
Для документирования OpenAPI/Swagger. И/или специализированные инструменты типа Postman.
Если скорости критичны, то использовать бинарные с предопределенной типизацией.
Если критичная скорость разработки, то использовать текстовые без типизации.

O
Ogoun Er, 2019-01-26
@Ogoun

Раньше использовать брокеры сообщений (RabbitMQ, ActiveMQ, NATS, ZeroMQ), в итоге пришел к общению посредством ServiceDiscovery.
Т.е. в сети есть сервис который хранит таблицу адресов других сервисов и периодически ее раздает. Плюс проходит по таблице и пингует не пропал ли какой сервис из доступа. Остальные сервисы общаются друг с другом напрямую, получая адрес нужного сервиса из таблицы. При этом, если запущено несколько одинаковых сервисов, то передача данных им идет через round-roobin балансировку (конечно это для stateless сервисов, если есть состояние придется усложнить алгоритм общения).
Транспорт может быть любой, использую REST или протокол поверх TCP как более быстрый вариант.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question