Правильный способ вызова метода "забей и забудь" в сервисе 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, как предлагают многие места, потому что они просто принесут вам дополнительную работу и не будут работать так гладко, как подход промежуточного уровня.

Другие вопросы по тегам