2017-08-01 9 views
0

私はHttpリクエストでSMSを送るためのAPIを開発しています。私はノードjsとmongooseを使用します。だから、私はマルチスレッドアプリケーションのような問題があります。ノードjsはmongoose/mongodbとの並行性を読み書きします

実際に、ユーザーがSMSを送信すると、彼はすでに(mongooseを使用して)データベースに送信したSMSの数を確認し、その数が制限を超えていなければSMSのSMSが送信され、SMSの数彼はデータベース内のインクリメントを送信しました(スキーマ内で時間、日、週、および月に送信したSMSの数の値があります)。しかし、私のコードでは、値の読み取りと値の増分などの処理のためにコールバックを使用しています。

したがって、ユーザーが非常に迅速に要求を送信すると、異なるコールバックが送信されたSMSの同じカウントを読み取って、送信されたSMSにユーザーを認可し、同じ値をインクリメントして保存して、偽です。

変数にアクセスするマルチスレッドアプリケーションでは、実際のスレッドがすべてのスレッドを実行する前に他のスレッドが変数を読み取ることを防ぐことができます。

ノードjsイベントシステムとmongoDBのデータにアクセスするだけで、私の問題を解決する方法がわかりません。

回答ありがとうございます。

PS:解決策はわかりませんが、ノードjsがマルチコアを使用できるようにするクラスタでも機能すると良いでしょう。

+0

キューにメッセージを追加し、前のメッセージの処理後にのみ次のメッセージを処理できます。 – Cristy

+0

また、これを読んでください:https://docs.mongodb.com/manual/faq/concurrency/#what-type-of-locking-does-mongodb-use – Cristy

答えて

0

ありがとうCristy、私はasync queueを使用して私の問題の主要部分を解決しました。

私のアプリケーションは、ノードjsのデフォルトの方法で実行するとうまく動作します。 しかし、他の問題があります。私は4つのコアを持つサーバー上で自分のコードを実行するつもりですので、ノードクラスタモジュールを使いたいと思います。しかし、私がこれを使用したときには... 4つの異なるプロセス(私は4つのコアを持つサーバーを使用していました)のコードを実行するため、異なるキューが使用されていました。以前に言及したエラーは常に発生し、処理の検証+更新を終了します。

私は、最適で高速なアプリケーションを得るために何をすべきかを知りたいと思います。 クラスタモジュールの使用を中止し、マルチコアサーバーの利点を利用しないでください(これは最善の答えではないと思います)。 私はmongodbに格納すべきでしょうか(おそらくキューを永続化せずに他のメモリに格納して速くしてみてください)? クラスタを使用しているときにコード内のキューを共有する方法はありますか?

私の最良の選択肢は何ですか?

0

私はキャッシュアプ​​ローチを試してみるべきだと思います。 私はあなたと同じ状況に遭遇します。 処理中のrecord_idを格納するためにcacheを使用しようとします。 新しいリクエストが来たら、次のプロセスにチェックキャッシュが必要です。 record_idがキャッシュにある場合は、そのレコードが他のスレッドによって使用されていることを意味します。そのスレッドは完了するまで待つか何かをする必要があります。プロセスが終了し、コールバック関数のキャッシュ内のrecord_idが削除された場合

+0

返信ありがとう...私は本当に知りませんどうすればいいですか...コードスニペットは使えますか? – Sekki

関連する問題