none
オンプレミスで大量のメッセージ(伝票)を受け取る場合のキュー(Queue)の実装についてどんなものがありますか? RRS feed

  • 質問

  • クラウドだと、Service Bus、Event Hub、IoT Hub、cosmosDBなどスケールも
    処理時間も想定でき、永続性もある仕組みが有り、実装はしやすいのですが、
    オンプレミスの場合は、お勧めの仕組みがあるのでしょうか?

    良い仕組みがあれば試してみたいと考えています。

    環境
      .NET Core
      Linux/Windows

    でプロトコルはgRPCで実装し、サービス展開を考えています。

    その中で受け取ったメッセージを確実にQueueにいれて、別プロセスで処理(Dequeue)したい。プロセス間の排他制御が必要。
    永続化できて、高速で安定して動作する無料の仕組みを探しています。
    スケールは、5000台から2分毎に1メッセージとなり、サーバは秒間40メッセージの受け取りとなる想定です。

    こちらの考え、試したこと
      MSMQ           ・・遅く、安定性に難があるという認識。まだ、試してはいない。
      NuGetのDiskQueue・・使ってみましたが、遅い。Enqueueに80msくらいかかる。
     SQLiteやMySQLをベースにしたQueue処理の実装・・まだ試していない。自作になるのでもっと良い方法があるのではと考えています。
    以上

    2020年8月20日 1:13

回答

  • 各位へ

    すみません。自己解決しました。

    gRPCのサービスで受信したメッセージは、メモリ上のSystem.Collections.Queueに格納することで、秒間数千メッセージは受け取れています。
    上限値はまだ確認が取れていませんが、秒間万件の受信は可能そうで負荷分散せずに処理をこなせそうです。

    今回の遅延の根本的な原因は、
    メッセージを1件1件プロセス間排他を入れて永続化することがボトルネックだったので、それをバックグラウンド処理にさせ一括化さたことで、受信処理はすべてオンメモリで動作し、永続化処理も一括処理によって性能改善に繋がりました。これで、性能面で問題はなくなりました。

    ロジックでの対応となり、同一の受信プロセス中で、メモリ上のメッセージを永続化する時間指定のバックグラウンドのホステッドサービスを用意して、そのなかで、溜まっているデータを一括でDiskQueueに放り込むと、1000メッセージあたり、15msくらいで処理できています。複数のドライブへの書き込み負荷分散も容易にできそうです。

    あと、永続化されたQueueを別のプロセスから取得して処理する部分もリアルタイムに同時に動いていていてうまく予定の性能で処理できるようになりました。

    ご協力をありがとうございます。解決とさせて頂きました。

    送信クライアントとDequeueして処理するクライアントは複数動作する。
    https://github.com/kiyo7447/RealTimeBigDataWorkloadProcess
    • 回答としてマーク kiyo7447 2020年8月21日 1:00
    2020年8月21日 0:01

すべての返信

  • 各位へ

    すみません。私の検証をDebug実行でしていたために処理が遅かったです。
    NuGetのDiskQueueでも30msくらいで動作してそれなりに高速に動作してプロセス間で排他制御をしながら動作していました。

    しかし、それでも処理スピードはまだまだ遅くログ出力処理のようにメモリ処理にして定期的に永続化できると良いのですが、、
    良い方法があればと考えています。

    2020年8月20日 7:12
  • 各位へ

    すみません。自己解決しました。

    gRPCのサービスで受信したメッセージは、メモリ上のSystem.Collections.Queueに格納することで、秒間数千メッセージは受け取れています。
    上限値はまだ確認が取れていませんが、秒間万件の受信は可能そうで負荷分散せずに処理をこなせそうです。

    今回の遅延の根本的な原因は、
    メッセージを1件1件プロセス間排他を入れて永続化することがボトルネックだったので、それをバックグラウンド処理にさせ一括化さたことで、受信処理はすべてオンメモリで動作し、永続化処理も一括処理によって性能改善に繋がりました。これで、性能面で問題はなくなりました。

    ロジックでの対応となり、同一の受信プロセス中で、メモリ上のメッセージを永続化する時間指定のバックグラウンドのホステッドサービスを用意して、そのなかで、溜まっているデータを一括でDiskQueueに放り込むと、1000メッセージあたり、15msくらいで処理できています。複数のドライブへの書き込み負荷分散も容易にできそうです。

    あと、永続化されたQueueを別のプロセスから取得して処理する部分もリアルタイムに同時に動いていていてうまく予定の性能で処理できるようになりました。

    ご協力をありがとうございます。解決とさせて頂きました。

    送信クライアントとDequeueして処理するクライアントは複数動作する。
    https://github.com/kiyo7447/RealTimeBigDataWorkloadProcess
    • 回答としてマーク kiyo7447 2020年8月21日 1:00
    2020年8月21日 0:01