zplCloud Blog
Kafka トピックから直接プリンターへ: データストリーミングを印刷のトリガーにする
購読 1 つ = トピック + デザイン + プリンター。印刷が失敗したときにコンシューマーが何をするかが読みどころです。
ストリームはすでにそこにある
御社の ERP や MES は、受注イベント、ピッキングのメッセージ、シリアル番号をすでに Kafka に流しています。多くの場合、そのストリームは画面で終わり、人が印刷ボタンを押します。
Data Streaming タブは、そのストリームをトリガーに変えます。トピックを購読すると、メッセージごとにラベルデザインでレンダリングされ、プリンターに送られます。ミドルウェアもポーリングジョブもプリントサーバーも要りません。
配置は 2 通りです。
- クラウド: プラットフォーム自身がトピックを消費します(Confluent Cloud、MSK、インターネットから到達できる任意のブローカー)。
- オンプレミス: ネットワーク内のブローカーを zplCloud CLI エージェントが消費します。ブローカーの認証情報がネットワークの外に出ることはありません。
購読が結び付けるもの
結び付けるのは 4 つです。トピック、ラベルデザイン、プリンター、そしてクラウド運用ではブローカーの接続設定です。メッセージごとにプラットフォームは次の処理を行います。
1. 値を JSON として解析し、オブジェクトのキーをフィールドのバインディングとして使います、
2. デザイナーが使うのと同じエンジンでデザインをレンダリングします、
3. 生成した ZPL をプリンターに送ります(Weblink、または CLI エージェント上のリモートプリンターへ TCP 9100 / USB 経由)。
値が JSON でない場合は、テキスト全体が $message にバインドされます。1 項目だけのラベルならこれで足ります。
接続設定
設定は key=value; 形式の文字列で、保存時は AES で暗号化されます。
BootstrapServers=pkc-xxxxx.eu-central-1.aws.confluent.cloud:9092;
GroupId=zplCloudPrinter;
SecurityProtocol=SaslSsl;SaslMechanism=Plain;
SaslUsername=<api-key>;SaslPassword=<api-secret>
指定しなかった場合に適用される既定値です。
| 設定 | 既定値 | 意味 |
|---|---|---|
AutoOffsetReset | Latest | 新しい購読は末尾から始まります。初回起動でトピックの履歴をすべて印刷することはありません |
EnableAutoCommit | false | オフセットはタイマーではなく、印刷が成功した後にプラットフォームがコミットします |
AutoCommitIntervalMs | 0 | 自動コミットが無効な間は関係ありません |
AutoOffsetReset=Earliest は、トピックを再生したいときに意識して選ぶ設定です。本当にそのつもりのときだけ設定してください。履歴のあるトピックでは、初回起動でその全部を印刷します。
SCRAM(SaslMechanism=ScramSha256 / ScramSha512)とカスタム CA(SslCaLocation=…)に対応しています。未知のキーはそのままコンシューマーの設定に渡されます。
オンプレミスのブローカーは、代わりにエージェント側で登録します。
zplcloud proxy --agent "Lager" \
--kafka LOKAL="BootstrapServers=10.0.0.10:9092;GroupId=zplCloudConsumer"
エージェントは Kafka brokers: LOKAL と表示します。購読で必要になると、プラットフォームがエージェントにコンシューマーの実行を依頼します。ブローカーはインターネットから到達できないままです。
配信のセマンティクスを正確に
ストリーミング連携でいちばん曖昧に語られがちな部分なので、実装どおりに書きます。
- コンシューマーは 30 秒のタイムアウトでポーリングします。
- メッセージを受け取ると、レンダリングして印刷し、印刷が成功した場合にだけ
Commit(msg)を実行します。 - 印刷が失敗した場合、オフセットはコミットされず、コンシューマーは停止します。 購読は切断状態になり、
Print failed: <error>と表示されます。メッセージを読み飛ばすことも、再試行ループで回り続けることもありません。 - 既定が
AutoOffsetReset=Latestであるため、失敗後に再起動しても、失敗したメッセージが自動で再配信されることはありません。再起動時に再試行させたい場合は、設定にAutoOffsetReset=Earliestを入れてください。そうすればコミットされていないオフセットが再び読み込まれます。
考え方はこうです。印刷されなかったラベルは、誰かが気付くべき運用上の事実です。黙って先へ進めば物理的なラベルが 1 枚失われますし、延々と再試行すればパーティションが滞ります。停止すれば問題が見えるようになり、オフセットもその場に残ります。
ConsumeException、つまりブローカーに到達できない、認証が拒否された、トピックが消えた、といった場合は扱いが異なります。これは印刷の失敗ではないため、コンシューマーは 5 秒から始まり 60 秒で頭打ちになる指数バックオフで再試行し、直近のブローカーエラーが購読に表示されます。
アイドル時のキープアライブ
60 秒メッセージが届かないと、プラットフォームは対象のプリンターにウェイクコマンドを送ります。Link-OS プリンターは省電力状態に入るため、キープアライブがないと、静かな時間の後の最初のメッセージは印刷前に復帰の待ち時間を負担することになります。キープアライブが触れるのはプリンターであってトピックではありません。オフセットの消費もコミットも行いません。
購読を作成する
| 項目 | 値 |
|---|---|
| 名前 | Production labels |
| 種別 | クラウド(インターネット)またはオンプレミス(zplCloudCli 経由) |
| 接続設定 | クラウドのみ: BootstrapServers=…;… |
| エージェント + ブローカー | オンプレミスのみ: エージェントとブローカーのチップを選びます |
| トピック | production.orders |
| ラベルデザイン | メッセージのキーとバインディングが一致するデザイン |
| プリンター | Weblink プリンター、または CLI エージェント上のリモートプリンター |
Start を押します。購読にはライブの状態、つまり接続状況、最終メッセージの時刻、最終オフセット、メッセージ件数が表示され、あわせて直近のメッセージの値と印刷結果のログも表示されます。
メッセージの形
{ "ean": "40063813", "qty": 2, "dest": "Ramp 4" }
キーは名前でバインディングに対応付けられます。どのバインディングも使わないキーは無視され、対応するキーのないバインディングは空でレンダリングされます。本番稼働の前に、実際のメッセージでラベルを設計してください。デザイナーの テストデータ は貼り付けた JSON を受け付けます。
再起動時の動作
有効な購読はプラットフォームの再起動時に再開し、オンプレミスの購読は CLI エージェントの再接続時に再開します。夜間のメンテナンス時間や接続断のたびに、誰かが Start を押し直す必要はありません。ただし前述の例外があり、印刷の失敗で停止した購読は、プリンターを直して開始するまで停止したままです。
プラン
データストリーミングは従量制です。Starter では検証用に含まれ、月 100 枚のストリーミング印刷が上限です。Pro はストリーミングのエンドポイントを 2 つ(Kafka / Azure Service Bus)含み、追加のエンドポイントは 1 か月あたり 10 € です。料金ページをご覧ください。