決済システムは決済を完了すると「決済完了」の知らせを送ります。私たちのポイント サービスはその知らせを受け取り、その注文に該当するポイントの分だけユーザーの 残高を差し引かなければなりません。 PointConsumer.handlePaymentCompleted(event) を完成させてください。 event には orderId, userId, points が入っています。受け取った points の分だけ、 そのユーザーの残高から引けば大丈夫です。 Note: 決済システムは知らせを「少なくとも一度」は送ると約束しています。ネットワーク の事情によって、同じ知らせが遅れてもう一度届くこともあります。
NestJS で決済完了イベントを受けてユーザーのポイントを差し引くコンシューマーを作る 問題です。決済システムは知らせを少なくとも一度送り、ネットワークの事情によって 同じ知らせが再び届きうる環境を想定します。決済完了イベントを受けるコンシューマーの 処理を完成させ、残高はインメモリストアを唯一の真実の源として使います。
この問題は「同じ知らせが再び来ても、結果が一度だけ反映されるべき」処理を扱います。 ポイント・残高・在庫のように、一度起きたことを一度だけ反映しなければならない資源 では、知らせを一度だけ受け取るときは問題なく見えても、同じ知らせが再配信される 瞬間が本当の試金石になります。こうしたコードを検証するときは、一度の処理だけでなく、 同じ知らせを二度入れたうえで結果が一度だけ反映されたかを確認する習慣が大切です。