# パブリッシュ／サブスクライブ

世界トップクラスのMQTTブローカーであるEMQXは、MQTTプロトコルの重要な機能である[パブリッシュ／サブスクライブメッセージングパターン](./mqtt-concepts.md#publish-subscribe-pattern)をサポートしています。EMQXのパブリッシュ／サブスクライブ機能は、ワイルドカードトピックのサポート、トピックベースのメッセージフィルタリング、メッセージのパーシステンス、QoS（サービス品質）設定など、多様な機能を備えており、複雑かつ高性能なメッセージングアプリケーションに適しています。

**パブリッシュ**機能は、EMQXブローカーに接続されたデバイスが特定のトピックにメッセージを送信できるようにします。メッセージにはセンサーの読み取り値、ステータス更新、コマンドなど、あらゆる種類のデータを含めることができます。デバイスがトピックにメッセージをパブリッシュすると、EMQXはそのメッセージを受信し、そのトピックをサブスクライブしているすべてのデバイスに転送します。

EMQXの**サブスクライブ**機能は、デバイスが特定のトピックからメッセージを受信できるようにします。デバイスは1つ以上のトピックをサブスクライブでき、サブスクライブしたトピックでパブリッシュされたすべてのメッセージを受け取ります。これにより、デバイスはリアルタイムで特定のイベントやデータストリームを監視でき、常に更新をポーリングする必要がなくなります。

<img src="./assets/pub-sub-pattern.png" alt="パブリッシュ／サブスクライブパターン" style="zoom:35%;" />

## 拡張パブリッシュ／サブスクライブ機能

EMQXはネイティブなMQTTパブリッシュ／サブスクライブモデルをサポートするだけでなく、より高度で非同期のメッセージングシナリオを支援するために多くの強力な拡張機能も提供しています。

本章では、[MQTTコアコンセプト](./mqtt-concepts.md)を学び、EMQXでパブリッシュ／サブスクライブ機能を試し、MQTTクライアントツールを使って以下のMQTT固有機能をテストする方法を紹介します。

- [共有サブスクリプション](./mqtt-shared-subscription.md)
- [保持メッセージ](./mqtt-retained-message.md)
- [遺言メッセージ](./mqtt-will-message.md)
- [トピックワイルドカード](./mqtt-wildcard-subscription.md)

### EMQXにおけるMQTT拡張

ネイティブなMQTT機能に加え、EMQXは基本的なパブリッシュ／サブスクライブモデルを拡張・強化する複数の機能を提供しています。これらの機能は、高度なメッセージングパターン、オフライン消費、トピック管理などを扱うために設計されています。

- [排他サブスクリプション](./mqtt-exclusive-subscription.md)
- [遅延パブリッシュ](./mqtt-delayed-publish.md)
- [自動サブスクライブ](./mqtt-auto-subscription.md)
- [トピック書き換え](./mqtt-topic-rewrite.md)
- [サブスクリプションフィルター](../../develop/subscription-filter/subscription-filter-concept.md)
- [メッセージキュー](../../develop/message-queue/message-queue-concept.md)

### サブスクリプションフィルター（高度機能）

[サブスクリプションフィルター](../../develop/subscription-filter/subscription-filter-concept.md)は、EMQX 6.2で導入された高度な機能で、MQTT 5.0のパブリッシュ／サブスクライブモデルを拡張し、サブスクリプションレベルでのコンテンツベースフィルタリングを可能にします。トピックフィルターにフィルター式を付加することで、サブスクライバーはMQTT 5.0のユーザープロパティが指定条件を満たすメッセージのみをEMQXに配信させることができます。

これにより、別のトピック階層を用意したりパブリッシャーを変更したりすることなく、サーバー側で正確なメッセージルーティングが可能になります。

- 任意のMQTT 5.0ユーザープロパティのキー・バリューでフィルタリング
- 複数条件を論理AND（`&`）で組み合わせ可能
- クライアント側のフィルタリングロジック不要の完全サーバーサイド処理

### メッセージキュー（高度機能）

[メッセージキュー](../../develop/message-queue/message-queue-concept.md)は、EMQX 6.0で導入された高度な機能で、MQTTパブリッシュ／サブスクライブモデルを耐久性と非同期メッセージキューイング機能で拡張します。サブスクライバーがオフラインの間もメッセージを保存でき、高度な配信戦略やLast-Value Semanticsによるメッセージ圧縮をサポートします。

共有サブスクリプションや保持メッセージとは異なり、メッセージキューは以下を提供します。

- クライアント接続状態に依存しない耐久的なメッセージパーシステンス
- 設定可能なキューのライフサイクルおよびメッセージのTTL（有効期限）
- キュー単位の配信セマンティクスと細かい制御
