blog

ThingsBoard

この記事では、thingboardに関連する主な知識を記録します。設計アーキテクチャー、ローカルコンパイル、ランモードなどのほか、難問も記録。ソースコード解析の一部、これを元にした二次開発支援に使用。...

Sep 27, 2023 · 9 min. read
シェア

thingsboard

第1章: thingsboardの展開シナリオとパフォーマンス要件

パフォーマンス要件

第2章: thingsboardのルールチェーンキューのパラメータ設定

Thingsboardはデフォルトで3つのキューを提供しており、主にその違いは送信と処理の戦略です。

HightProritytb_rule_engine.hpBURST;batchSize:001type:RETRY_FAILED_TIMED_OUT;retries:0;failurePercentage:0. 0;pauseBetweenRetries:5;maxPauseBetweenRetries:50020
SequentialByOriginatortb_rule_engine.sqSEQUENTAL_BY_ORIGINATOR;batchSize :001type:RETRY_FAILED_TIMED_OUT;retries:3;failurePercentage:0.0;pauseBetweenRetries:3;maxPauseBetweenRetries:30020

キューの構成説明

送信設定 - メッセージがルールエンジンに送信される順序とロジックを定義します

  1. BURST - すべてのメッセージが順番にルールエンジンに送信されます
  • Batch - メッセージはグループ化パラメータを使用してグループ化されます。前のバッチが確認されるまで、新しいバッチは送信されません
  • シーケンシャル:メッセージは1つずつ送信されます。新しいメッセージは、前のメッセージが送信された後にのみ送信できます。これは非常に非効率的です。

    テナントごとのシーケンシャル:メッセージはテナントごとに順番に送信されます。

    発信者ごとのシーケンシャル:メッセージは特定のデバイスに対して1つずつ送信されます。新しいメッセージは、前のメッセージが正常に送信された後にのみ送信できます。

    処理設定の廃止 - メッセージの確認ロジックを定義します。再試行処理には、以下の6つの有効な戦略があります。

    1. 失敗およびタイムアウトの再試行 - メッセージパッケージ内の失敗およびタイムアウトしたメッセージをすべて再試行します
  • すべての失敗をスキップ - すべてのエラーメッセージを無視します。エラーメッセージは破棄されます。例えば、データベースがダウンした場合、メッセージは永続化されず、代わりに確認済みとしてマークされます。 メッセージキューから削除されます。 推奨しません。
  • skip all failures and timeouts -- すべてのエラーおよびタイムアウトメッセージを無視します。
  • retry all-- 処理パッケージ内のすべてのメッセージを再試行します。 処理パッケージ内の100メッセージのうち1つでも失敗した場合は、すべてのメッセージが再処理され、ルールエンジンに送信されます。
  • retry faild -- 処理パッケージ内の失敗したメッセージのみを再試行します。

    retry timeout-- タイムアウトしたメッセージを再試行します。

    再試行ポリシーのパラメータ
    1. 再試行回数: 再試行の回数、0は無制限を意味します
  • 再試行をスキップする失敗メッセージの割合 -- 再試行をスキップする失敗メッセージの割合です。 つまり、失敗またはタイムアウトしたメッセージの割合が定義された割合よりも少ない場合は、再試行をスキップします。
  • 再試行までの時間(秒) -- 再試行までの時間、つまり、コンシューマスレッドが再試行を待機する時間です。 このパラメータは通常、操作またはタスクが失敗した後、一定の時間間隔で再試行するために使用されます。

    追加の再試行までの時間(秒) -- 2回目以降の再試行までの待機時間です。

    ポーリング設定

    1. バッチ処理
    • ポーリング間隔:メッセージキューが新しいメッセージをポーリングする間隔(ミリ秒単位)。新しいメッセージが到着しない場合、メッセージポーリングメカニズムは定期的にメッセージキューを新しいメッセージの到着について確認します。
    • パーティション -- メッセージキューに関連付けられたパーティションの数。メッセージの同時消費数を増やすことができます。
    1. タイムリーな処理
    • 各コンシューマーに対してメッセージのポーリングを送信します。この項目は、UI構成ページで提供されています。選択されていない場合、デフォルトではすべてのパーティションに1つのコンシューマーのみが存在します。構成されている場合、各パーティションは独自のコンシューマーを指定します。

    処理が割り当てられます。

    ThingsboardでKafkaをキューエージェントとして使用する際の関連パラメータの設定説明

    Kafkaの生成に関連するパラメータ
    • buffer.memoryは、Kafkaの生成で使用できるバッファのサイズを制限します。デフォルト値は32MBです。
      • buffer.memoryが低く設定されていると、問題が発生する可能性があります。メッセージはすぐにメモリキャッシュに書き込まれますが、送信スレッドには送信する時間がなく、メッセージが蓄積され、最終的にキャッシュが満杯になり、スレッドがブロックされます。

        Kafkaの生産に関連するパラメータ

      • buffer.memoryは、Kafkaの生産者が使用できるバッファのサイズを制限します。デフォルト値は32MBです。
      • buffer.memoryが小さく設定されていると、問題が発生する可能性があります。メッセージはすぐにメモリキャッシュに書き込まれますが、送信スレッドにはそれらを送信する時間がなく、メッセージが蓄積され、最終的にキャッシュが満杯になり、スレッドがブロックされます。 プロデューサーは、Kafkaへのメッセージの書き込みを継続できなくなります。
    • batch.size プロデューサーがメッセージを送信する際に、一度に蓄積するメッセージのサイズです。プロデューサーはバッチ送信メカニズムを使用し、このパラメーターはバッチのサイズを制御します。デフォルトは16KBです
    • プロデューサーがメッセージを送信する際には、まずメッセージをメモリ内のキャッシュに送信し、その後でメッセージをバッチ化します。バッチサイズはbach.sizeパラメータで指定します。メッセージバッチのバイト数が指定した閾値に達すると、メッセージのバッチがまとめてKafkaサーバーに送信されます。

      プロデューサーをメッセージ確認モードで送信するように設定するには、acksを使用します。
      • aks=0 の場合、プロデューサーはサーバーからの応答を待たずに、単にリクエストを送信します。メッセージのエラーや損失を検出することはできません。これは最も信頼性の低いモードです。
    • aks=1 の場合、プロデューサーはメッセージ送信後にサーバーから確認応答を受け取ります。これは、少なくとも1つのレプリカがメッセージを正常に受信したことを意味します。ただし、確認応答の受信後にレプリカに障害が発生し、データが失われる可能性があるため、プロデューサーは依然としてメッセージ損失のリスクにさらされています。デフォルトのモード
      • acks=all または -1:プロデューサーはメッセージを送信した後、すべてのレプリカがメッセージを受信するまで待ちます。最も信頼性の高いメッセージ確認モードです。ただし、処理効率は最も遅くなります。
    • linger.ms は、プロデューサーがメッセージを送信するまでの遅延時間を設定します。
    • デフォルトでは、プロデューサーはすぐにメッセージをサーバーに送信しますが、プロデューサーの効率とスループットを向上させるには、linger.ms パラメーターを設定します。 これは、しきい値に達したときにプロデューサーがバッファに蓄積されたメッセージを一度に送信するように遅延を設定します。バッファで待機する時間を指定します。メッセージが batch.size で定義されたしきい値サイズに達しなかった場合でも、すでに時間が経過している場合は、メッセージは送信されます。

    • compression.type プロデューサーが Kafka サーバーに送信するメッセージの圧縮タイプを指定します。 圧縮が構成されている場合、Kafkaサーバーがデータを自ら解凍することができます。
      • none: 圧縮なし
    • gzip: GZIPアルゴリズムを使用してデータを圧縮
    • snappy: Snappy圧縮アルゴリズムを使用してメッセージを圧縮。高速で、CPUリソースの使用も少なくなります。ただし、GZIP圧縮よりも効率は低くなります
      • lz4 は lz4 圧縮アルゴリズムを使用します。
    • max.in.flight.requests.per.connection は、サーバーへの単一接続でプロデューサーが送信できる未確認リクエストの最大数を制御します。
    • パラメータの定義 プロデューサーがサーバーからの応答を受信せずに同じ接続に送信できる未確認リクエストの最大数。 プロデューサーがサーバーにメッセージを送信した後、サーバーがリクエストを受信したことを確認し、応答を送信するまで待ちます。応答を待っている間、プロデューサーはさらにリクエストを送信し続けることができます。このパラメータは、サーバーからの応答を受信せずに送信できるリクエストの最大数を指定します。設定を小さくすると、ネットワークとプロデューサーの負荷が軽減されます。

    • 再試行回数 プロデューサーが再試行可能なエラーを送信する際にメッセージを送信する最大回数を指定します。

    Thingsboard ローカルソースコードのコンパイルと実行

    注意事項

    1. プラグインライセンスが無効になります
    <!-- <plugin>--> <!-- <groupId>com.mycila</groupId>--> <!-- <artifactId>license-maven-plugin</artifactId>--> <!-- <version>3.0</version>--> <!-- <configuration>--> <!-- <header>${main.dir}/license-header-template.txt</header>--> <!-- <properties>--> <!-- <owner>The Thingsboard Authors</owner>--> <!-- </properties>--> <!-- <excludes>--> <!-- <exclude>**/.env</exclude>--> <!-- <exclude>**/*.env</exclude>--> <!-- <exclude>**/.eslintrc</exclude>--> <!-- <exclude>**/.babelrc</exclude>--> <!-- <exclude>**/.jshintrc</exclude>--> <!-- <exclude>**/.gradle/**</exclude>--> <!-- <exclude>**/nightwatch</exclude>--> <!-- <exclude>**/README</exclude>--> <!-- <exclude>**/LICENSE</exclude>--> <!-- <exclude>**/banner.txt</exclude>--> <!-- <exclude>node_modules/**</exclude>--> <!-- <exclude>**/*.properties</exclude>--> <!-- <exclude>src/test/resources/**</exclude>--> <!-- <exclude>src/vendor/**</exclude>--> <!-- <exclude>src/font/**</exclude>--> <!-- <exclude>src/sh/**</exclude>--> <!-- <exclude>packaging/*/scripts/control/**</exclude>--> <!-- <exclude>packaging/*/scripts/windows/**</exclude>--> <!-- <exclude>packaging/*/scripts/init/**</exclude>--> <!-- <exclude>**/*.log</exclude>--> <!-- <exclude>**/*.current</exclude>--> <!-- <exclude>.instance_id</exclude>--> <!-- <exclude>src/main/scripts/control/**</exclude>--> <!-- <exclude>src/main/scripts/windows/**</exclude>--> <!-- <exclude>src/main/resources/public/static/rulenode/**</exclude>--> <!-- <exclude>**/*.proto.js</exclude>--> <!-- <exclude>docker/haproxy/**</exclude>--> <!-- <exclude>docker/tb-node/**</exclude>--> <!-- <exclude>ui/**</exclude>--> <!-- <exclude>**/.browserslistrc</exclude>--> <!-- <exclude>**/yarn.lock</exclude>--> <!-- <exclude>**/.yarnrc</exclude>--> <!-- <exclude>**/.angular/**</exclude>--> <!-- <exclude>**/*.raw</exclude>--> <!-- <exclude>**/*.patch</exclude>--> <!-- <exclude>**/apache/cassandra/io/**</exclude>--> <!-- <exclude>.run/**</exclude>--> <!-- <exclude>**/NetworkReceive.java</exclude>--> <!-- <exclude>**/lwm2m-registry/**</exclude>--> <!-- </excludes>--> <!-- <mapping>--> <!-- <proto>JAVADOC_STYLE</proto>--> <!-- <cql>DOUBLEDASHES_STYLE</cql>--> <!-- <scss>JAVADOC_STYLE</scss>--> <!-- <jsx>SLASHSTAR_STYLE</jsx>--> <!-- <tsx>SLASHSTAR_STYLE</tsx>--> <!-- <conf>SCRIPT_STYLE</conf>--> <!-- <gradle>JAVADOC_STYLE</gradle>--> <!-- </mapping>--> <!-- </configuration>--> <!-- <executions>--> <!-- <execution>--> <!-- <goals>--> <!-- <goal>check</goal>--> <!-- </goals>--> <!-- </execution>--> <!-- </executions>--> <!-- </plugin>--> <!-- <plugins>--> <!-- <plugin>--> <!-- <groupId>com.mycila</groupId>--> <!-- <artifactId>license-maven-plugin</artifactId>--> <!-- </plugin>--> <!-- </plugins>-->
    -->license-maven-plugin-->3.0-->-->
    ${main.dir}/license-header-template.txt
    -->-->The Thingsboard Authors-->-->**/*.current-->-->-->
    1. ### msa の js-executor がエラーで実行
    • 現象:
    Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.12.0:yarn (yarn pkg) on project js-executor: Failed to run task: 'yarn run pkg' failed. org.apache.commons.exec.ExecuteException: Process exited with an error: 2 (Exit value: 2) -> [Help 1]
    Failed to execute goal com.github.eirslett:frontend-maven-plugin:1.12.0:yarn (yarn pkg) on project js-executor: Failed to run task: 'yarn run pkg' failed. org.apache.commons.exec.ExecuteException: Process exited with an error: 2 (Exit value: 2) -> [Help 1]
    • 解決策
    1. markdown
      1. yarn install -g pkg
  • Read next

    瑞傑の「クラウド教室」が教育の公平性を加速する

    クラウド教室ESTのコア技術は、非常に少ないリソースで高性能な仮想デスクトップを提供することを保証します。 学生がネットワークにアクセスできる限り、クラウド教室ホストにアクセスするために複数の種類の端末を使用することができ、教室と同じ経験を得ることができます。

    Sep 14, 2023 · 1 min read