Правильный способ вызова метода "забей и забудь" в сервисе Service-Fabric
У меня есть метод на ServiceA, который мне нужно вызвать из ServiceB. Метод занимает более 5 минут, и его не волнует возвращаемое значение. (Вывод из метода обрабатывается другим способом)
Я настроил свой метод в IServiceA
как это:
[OneWay]
Task LongRunningMethod(int param1);
Однако это, кажется, не работает, потому что я получаю System.TimeoutException: This can happen if message is dropped when service is busy or its long running operation and taking more time than configured Operation Timeout.
Один из вариантов - увеличить время ожидания, но, похоже, должен быть лучший способ. Есть?
1 ответ
Для операций запуска и запуска или длительных операций наилучшим решением является использование шины сообщений в качестве промежуточного программного обеспечения, которое будет обрабатывать эту зависимость между обоими процессами.
Чтобы сделать то, что вы хотите без промежуточного программного обеспечения, вашему абоненту придется беспокоиться о многих вещах, таких как: тайм-ауты (как в вашем случае), гарантия доставки (подтверждение), доступность услуги, исключения и так далее.
При использовании промежуточного программного обеспечения единственное беспокойство, в котором нуждается логика вашего приложения, - это гарантия доставки, остальное должно обрабатываться промежуточным программным обеспечением и получателем.
Есть много вариантов, таких как:
- Сервисный автобус Azure
- Очередь хранилища Azure
- MSMQ
- Концентратор событий
- и так далее.
Я не рекомендовал бы использовать обходные пути SF Communication, Task.Run(), Threads, как предлагают многие места, потому что они просто принесут вам дополнительную работу и не будут работать так гладко, как подход промежуточного уровня.