Open1

トランザクションとバックグラウンド処理(非同期処理)について

まさぴょんまさぴょん

トランザクションとバックグラウンド処理(非同期処理)について

transactionを貼っているservice内で非同期処理で Webhook callすると、先にconnectionが閉じてしまいWebhookが正常にcallされない事象が発生する。

結論: トランザクション内では、同期的な処理だけ実行する

  • トランザクション内では、同期的な処理だけ実行する
  • 非同期処理は、await する
  • どうしても、非同期処理で並列バックグラウンド処理したいものがある場合は、トランザクション外で実行する!

理由と仕組みを整理する

  1. トランザクションの範囲とコミット/ロールバックによる、非同期処理の終了

    • サービス内でトランザクションが開始され、処理が行われます。
    • トランザクション内で非同期に、WebHookを呼び出すと、トランザクションのコミットやロールバックが完了する前に非同期処理が開始されます。
    • トランザクションが終了すると、データベース接続やリソースが解放され、非同期処理が必要とするリソースが失われる。
  2. 非同期処理とコネクションのタイミング

    • 非同期処理はバックグラウンドで行われるため、メインの処理(サービス内のトランザクション)が終了すると、プロセスやスレッドが終了してしまう場合があります。
    • その結果、非同期に呼び出そうとしたウェブフックの処理が完了せず、正常に呼び出されないことがあります。
  3. Webhookをトランザクションの外で呼び出す利点

    • トランザクションの外でウェブフックを呼び出すことで、トランザクションのコミットやロールバックに影響されずに処理を完了できます。
    • 非同期処理が必要な場合でも、専用のワーカーやキューを使用して確実に実行することができます。

まとめ

サービス内で非同期処理でウェブフックを呼び出そうとすると、トランザクションや接続のタイミングにより処理が完了しない可能性があります。
そのため、ウェブフックはサービスを呼び出すトランザクションの外で、適切な方法で呼び出すことが推奨されます。