問題タブ [message-queue]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
architecture - MSMQと一時テーブルダンプ
私はこの質問が少し前に尋ねられたことを知っています。しかし、周りを見回すと、どのルートを下るべきかまだ決まっていません。これが私のシナリオです、うまくいけばあなたは助けることができます:
数百のモバイルアプリケーションが定期的にアクセスする一連のWebサービスを提供します。これらのサービスは、デバイスに送信される新しい情報とデバイスから返される新しい情報の両方を使用して、デバイス上のデータを取得します。デバイスから返されるデータは、複数のデスクトップアプリケーションとWebサイトにもフィードする単一の中央SQLサーバーデータベースを更新する必要があります。
これらのサービスの要求/応答にかかる時間を短縮するために、デバイスから入ってくるデータを事後にMSMQインスタンスに貼り付けるか、シリアル化されたオブジェクトを一時データストアに保存して処理することにしました。 Windowsサービスは後でそれらを処理します。
だから私の選択はありますが、これとは別に、皆さんが私にアドバイスするのに役立つかもしれないいくつかのことがあります:
- デバイスから返されるデータは、サーバー側で注文する必要のある小さなメッセージパケットでは返されません。
- 私はMSMQについて何も知りませんが、以前にWindowsサービスを作成しました。必要に応じてMSMQを取得することに問題はありませんが。
- データが原因で何らかの理由で処理が失敗した場合に備えて、デバイスからの応答を保持したいと思います。このようにして、データに問い合わせて、問題があるかどうかを確認できます。つまり、デバイスでは、ユーザーがサーバー側データベースの関連フィールドの長さを拡張するコメントを追加できます。
この情報を使用して、MSMQの学習を検討する価値があると思いますか、それともより単純なソリューションに固執する必要がありますか?
クリス。
windows-services - Microsoft サービスの相互通信の問題
現在、2 つの Windows サービスを構築しています。
1 つ目は、インターネット接続からメッセージを取得し、データベースに挿入します。これは、高速で安定しており、他の処理を行わないように設計されています
2 つ目は、前回の実行以降に到着した新しいメッセージを使用してバッチ プロセスを実行します。
新しいメッセージを処理する準備ができたときにのみ 2 番目のサービスがバッチ プロセスを実行し、2 番目のサービスでエラーが発生した場合は最初のサービスが続行し、その逆も同様になるようにする方法を考えています。現時点では、5 秒ごとにループを使用しています。
私は現在、キューが空の場合にのみ最初のサービスがメッセージを書き込み、2 番目のサービスがキューにメッセージが含まれているかどうかを確認するメッセージ キューの使用を考えています。メッセージを削除して実行します。したがって、実際にはキューとしてではなく、状態が変化したときに 2 番目のサービスに対してイベントがトリガーされるバイナリ スイッチとしてキューを使用します。
私が遭遇したことのないこれを行うためのより良い方法があると思いますが、誰かが私を正しい方向に向けてくれますか?
multithreading - ロックせずにスレッドから別のスレッドにデータを出力する方法は?
DirectShow アプリケーションを開発しています。デッドロックの問題が発生しました。この問題は、スレッドから呼び出されたコールバック関数でロックを取得したことが原因のようです。これは、MSDN フォーラムで質問したクエストです。
ここで、そのスレッドでロックを取得することを避ける必要があります。しかし、問題は、オーディオを別のスレッドに出力する必要があることです。どうすればロックせずにデータを別のスレッドに入れることができますか?
win32 sdk の PostMessage を使用して別のスレッドにデータを投稿できると言う人がいます。ただし、メッセージを取得するには、Windows プログラムを実行する必要があります。私のプログラムは Python C++ 拡張モジュールです。メッセージをプルするループを追加するのは非常に難しい場合があります。したがって、ロックせずにスレッド間でデータを渡す別の方法を考えています。(実際には...プロデューサースレッドはロックできませんが、コンシューマースレッドはロックできます。)
ロックするかしないか、それが問題だ。
では、問題はどのように行うかです。
ありがとう。
- - - 編集 - - -
デッドロックが発生した理由はわかっていると思いますが、それは DirectShow の問題ではない可能性があります。
メインスレッドは Python が所有しており、stop を呼び出します。つまり、GIL を保持します。そしてスレッドリターンでDirectShowのコールバック待ちを停止。ただし、コールバックは GIL を取得します。
このように見えます
メイン(GILを保持) -> 停止(コールバックを待機) -> コールバック(GILを待機) -> GIL(メインスレッドで保持)
くそ!そのため、マルチスレッドはあまり好きではありません。何はともあれ、助けてくれてありがとう。
java - メッセージキュークライアントをテストするにはどうすればよいですか?
私はJavaメッセージキュークライアント(beanstalk)で作業していますが、現在、テストは次のようになっています。
私が書いたコードではないので、実際のキュー自体をテストするべきではないことを読みましたが、クライアントコードを書きます-これを書くためのより良い方法はありますか?私は自分自身を保証するためのテストが本当に必要ですが、スタイルに加えて、CIをセットアップするのもお尻の痛みです。
queue - マルチレベルのキュー設計
外部 Web サービスを扱うシステムを設計しています。このサービスは、一定期間 (T) に実行できるリクエストの数を制限します。システムでは、一定数のリクエスト (R) のバッチ処理が可能です。サービスがサポートする特定の数の操作があります (O)。
私のコードは、ユーザーからの不明な数のリクエストを処理します (この時点ではまったくわかりません。1 日に 1 つのリクエスト、1 秒に数千のリクエストになる可能性があります。ただし、1 秒に数千のリクエストを想定してビルドする必要があります)。これらの結果は、一定期間データベースにキャッシュされます。データベース レコードが古くなっている場合、システムは Web サービスからデータを再度要求する必要があります。
1 つのアカウントで 1 つの IP アドレスを介してのみ Web サービスにアクセスできます (操作の種類ごとに不正行為やアカウントの取得、または操作の種類ごとに 1 つのマシンを取得することはありません)。システムは (願わくば) 単一のサーバー上ですべて実行されます。
私がやろうとしていること (私が好きな結果が得られずに数週間オンとオフについて考えていた) は、次のようなシステムを考え出すことです:
- 重複したリクエストはマージされます (重複とは、同じリクエスト データがあることを意味します)
- ユーザー要求はシステム要求よりも優先されます
- システム要求をユーザー要求に変更できます (データベースの更新がキューにあり、ユーザーが同じデータを要求している)
- 特定の操作に対する R ユーザー要求がない場合、残りはシステム要求から取得されます。
- ユーザー要求は、入ってきたのと同じ順序で処理されます (ただし、ユーザー要求が処理されると、同じタイプの R 要求が処理されます)。
たとえば、T は 1 秒、R は 3 秒、O は 2 秒です。次の要求がシステムに入ります。
重複を処理すると、次のようになります。
リクエストは次の順序で処理する必要があります。
操作の種類は3~7種類になると思います。一部の操作タイプでは、他の操作タイプよりも多くのリクエストが発生します。システム要求は、ユーザー要求よりも多くなる可能性があります。
この種の問題に対処する一般的な方法はありますか? パターンかテクノロジーか?私はそれを考えすぎていますか (残念ながら、稼働状態になるまで使用統計を取得することはできません。それらがどうなるかを合理的に推測することさえできません)。
私が避けようとしている主なものは次のとおりです。
- システム リクエストがユーザー リクエストに対して処理される (システム リクエストは数週間待つことができます。ユーザー リクエストはできるだけ早く処理する必要があります)。
- データがデータベースにキャッシュされている期間に同じリクエストを 2 回行わない
linux - 複数のインスタンスを持つことができるアプリのメッセージ キューの一意のキーを作成する
Message-quene を介してプロセス間で通信する Linux CUI アプリを作成しました。
シングルインスタンスであれば問題ありません。ただし、同じアプリのインスタンスが複数ある場合、キュー内のメッセージが間違ったインスタンスに送信されます。
これは、msgget 関数に一意のキーを与えることで回避できることを理解しています。ftok() を使用してキーを作成しますが、変数が同じであるため、同じキーが生成されます。
インスタンスごとに一意のキーを設定する方法を教えてもらえますか?
私が今持っている唯一のアイデアは、ftok に与えられた変数をランダム化することであり、それが正しくないことはわかっています。