サービスディスカバリは、既存のコンピュータネットワークの確認なしに適切な定義を取得することはできません。コンピュータネットワークは、ネットワークデバイスがネットワークノードを介して利用可能なリソースを共有するために必要な通信プロトコルを設定します。このリソースの共有には、ネットワークデバイスとそのネットワークで事前定義されたサービスの両方が含まれます。
コンピュータネットワーク下でのこれらのネットワークデバイスおよびサービスの自動検出または検出の回避策は、サービス検出の実行可能な定義です。構成されたコンピューターネットワークでのサービス検出を完了するには、サービス検出プロトコル(SDP)と呼ばれるネットワークプロトコルの支援が必要になります。これらのプロトコルを使用すると、ネットワークユーザーと管理者は、ネットワーク構成スキルセットに依存して作業を進める必要がなくなります。
サービスディスカバリはコンピュータネットワーク上のソフトウェアエージェントと通信するため、重要なステップの実行が必要な場合は常にユーザーの継続的な介入を防ぐために、その通信プロトコルは共通のネットワーク言語に準拠する必要があります。
本番環境でのサービスディスカバリの概念化
従来、アプリケーション開発はモノリシックなアプローチを採用していました。このアプローチは、共通の目標に向かって機能する小さな同期された部分として単一のアプリケーションが存在するようにすることで、後でリファクタリングされました。この概念は、分離されたコンポーネントが単一のアプリケーション目標に向けて機能するマイクロサービスの有用性を定義します。 SaaSまたはエンタープライズアプリケーションは、アプリケーション開発へのこのアプローチの好みです。
小さなコンポーネントで定義されたアプリを使用すると、バグを簡単に排除し、完全に機能していないアプリコンポーネントを特定して置き換えることができます。これらのコンポーネントは破壊可能であるため、このようなコンポーネントを実稼働環境に展開すると、コンポーネントの場所やコンポーネントに接続されている他のサービスを識別するネットワークサービスにリンクされます。
本番アプリコンポーネントへのサービスインスタンスのこの自動構成は、サービス検出の定義を分解します。
Linux用の人気のあるオープンソースサービス検出ツール
マイクロサービスアーキテクチャの進化と最新のアプリの開発への貢献により、サービスディスカバリは必須となっています。新しいアプリコンポーネントがデプロイされると、サービス検出により、アプリと他のサービスエンドポイント間の遅延がなくなります。マイクロサービスを介したサービス検出機能の促進を検討する場合は、これらのオープンソースツールに精通している必要があります。
領事
Consulは、サービスディスカバリの目的を達成するだけでなく、ネットワークの運用設定を監視および構成するための効果的なツールです。 Serfのライブラリを介してピアツーピアのデータストアと動的クラスターを作成します。このため、このサービス検出ツールは高度に分散されています。
Consulは、本番環境を構成および管理するためのKey-Valueストアとして提供されます。 Serfは、作成されたクラスターの障害検出などを効果的に管理するゴシッププロトコルとして存在します。コンセンサスプロトコルは、Raftを介してこの本番環境のシステム整合性を処理します。
主な領事館の機能
- MySQL、DNS、HTTPなどのアプリインターフェースが存在する場合。サービスは簡単かつ自動的に自分自身を登録できます。また、セットアップネットワーク環境の正しい機能に必要な他の外部サービスを簡単に検出してカプセル化できます。
- このツールは、DNS構成を広範囲にサポートしています。 DNS統合プロセスをシームレスにします。
- セットアップクラスターにヘルスの問題がある場合、Consulはこのクラスターのヘルスチェックを効果的に実行し、診断結果を関連するネットワークオペレーターに送信されるログに登録します。
- Consulのキー/値ストレージ機能は、機能のフラグ付けと動的構成の作成に効果的です。
- このツールはHTTPAPIと連携して、分散キー/値ストア内に定義および制限されたキー/値データを保存および取得します。
領事クラスターのセットアップ
このガイドでは、複数のノードを使用してConsulクラスターを介してサービス検出を実現するための実用的なアイデアを紹介します。
前提条件
- 3台のLinuxサーバーにアクセスできる場合、このセットアップはより生産的になります。
- 3つのサーバーすべてで、指定されたポートをいくつか開いておく必要があります。 TCPの場合は8300、TCPとUDPの場合は8301、TCPとUDPの場合は8302、TCPの場合は8400、TCPの場合は8500、TCPとUDPの場合は8600です。使用しているサーバー(AWS、GCP、Azureなど)に応じて、ファイアウォールとセキュリティグループのタグを適切に構成して、上記のポートが簡単に通信できるようにする必要があります。
クラスターのセットアップを領事館
3台のサーバーを使用しているため、3ノードのConsulクラスターを実装します。これらのノードにconsul-1、consul-2、およびconsul-3という名前を付けることができます。次の手順により、完全に機能する領事クラスターにたどり着きます。
定義された3つのノードへのConsulのインストールと構成
手順1〜3は、定義されているすべての領事ノードに適用されます。
ステップ1 :各サーバーターミナルで、binディレクトリに移動し、Linuxディストリビューションに関する適切なコマンドを使用して、LinuxConsulバイナリをダウンロードします。この後者のリンクは、他のLinuxパッケージマネージャーのインストール手順を示しています。
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install consul
ステップ2: 以下のディレクトリを作成する必要があります。ディレクトリパスに注意してください。
sudo mkdir -p /etc/consul.d/scripts sudo mkdir /var/consul
ステップ3: 3つのサーバーから1つを選択し、その端末で次のコマンドを実行して、領事の秘密を作成します。生成されたシークレットはテキストファイルに保存する必要があります。
consul keygen
ステップ4: 3つのサーバーすべてに、次の構成ファイルが必要です。以下のように作成します。
sudo vi /etc/consul.d/config.json
上記で作成したconfig.jsonファイルに次のデータを入力します。このファイルでは、「encrypt」値を手順3で生成したConsulシークレット値に置き換える必要があります。また、「start_join」値には、使用することを選択した3台のサーバーのそれぞれのIPアドレスが含まれている必要があります。
{ "bootstrap_expect": 3, "client_addr": "0.0.0.0", "datacenter": "Us-Central", "data_dir": "/var/consul", "domain": "consul", "enable_script_checks": true, "dns_config": { "enable_truncate": true, "only_passing": true }, "enable_syslog": true, "encrypt": "generated_Consul_key_value", "leave_on_terminate": true, "log_level": "INFO", "rejoin_after_leave": true, "server": true, "start_join": [ "server-1_IP", "server-2_IP", "server-3_IP" ], "ui": true }
領事サービスの作成
3つのノードまたはサーバーはすべて、次の手順を実行する必要があります。
ステップ1: Systemdファイルの作成
sudo vi /etc/systemd/system/consul.service
ファイルが作成されたら、次のデータを入力します。
[Unit] Description=Consul Startup process After=network.target [Service] Type=simple ExecStart=/bin/bash -c '/usr/local/bin/consul agent -config-dir /etc/consul.d/' TimeoutStartSec=0 [Install] WantedBy=default.target
ステップ2: システムデーモンでリロードを実行します
sudo systemctl daemon-reload
クラスターのブートストラップと開始
最初のサーバーまたはconsul-1でConsulサービスを起動するには、その端末で次のコマンドを実行します。
sudo systemctl start consul
他の2つのサーバー、consul-2とconsul-3でConsulサービスを起動するには、それぞれのOSシステム端末で同じコマンドを実行する必要があります。
sudo systemctl start consul
3つのサーバーのそれぞれで、各端末で次のコマンドを実行することにより、それぞれのクラスターステータスを記録できます。
/usr/local/bin/consul members
Consulクラスターのセットアップが成功したかどうかを知るには、上記のコマンドを実行して得られる出力は、次のようなものである必要があります。
[fosslinux@consul-1 ~]$ /usr/local/bin/consul members Node Address Status Type Build Protocol DC Segment consul-1 10.128.0.7:8301 alive server 1.2.0 2 us-central <all> consul-2 10.128.0.8:8301 alive server 1.2.0 2 us-central <all> consul-3 10.128.0.9:8301 alive server 1.2.0 2 us-central <all>
領事UIへのアクセス
インストールされているConsulのバージョンが1.20以降の場合、組み込みのConsulUIコンポーネントがパッケージ化されています。このConsulUIはWebベースであり、ブラウザでアクセスするには、次のURL構文規則に従う必要があります。
http://<your-consul-server-IP-address>:8500/ui
上記のURL構文ルールの実装例は、次のようになります。
http://46.129.162.98:8500/ui

領事の実用性
Consulを使用することの欠点は、Consulで構成された分散システムに固有の複雑さを処理する場合です。この問題は一般的であり、これらのシステムのアーキテクチャによって異なります。それは執政官のパフォーマンスの側面とは何の関係もありません。
Consulを使用するもう1つの利点は、必要なライブラリがすべて揃っているため、ユーザーがサードパーティのライブラリを定義して使用する必要がないことです。領事の概念化をNetflixのOSSサイドカーに例えることができます。ここでは、Zookeeper以外のクライアントはシステムに登録できるため、引き続き検出可能です。
Consulサービスディスカバリツールの卓越性は、SendGrid、Percolate、DigitalOcean、Outbrain、EverythingMeなどの評判の良い企業を魅了しています。
Etcd
Etcdサービス検出ツールは、ConsulとZookeeperに同様に示されているキー/バリューストア機能を提供します。これは、OSの非推奨ステータスの前は主要なCoreOSコンポーネントでした。 Goプログラミング言語はその開発の鍵でした。また、コンセンサスプロトコルを処理する手段としてRaftを使用します。
JSONベースおよびHTTPベースのAPIの提供において、高速で信頼性があります。この機能の提供は、クエリおよびプッシュ通知によってさらに補完されます。実際の設定では、定義または作成されたクラスターは5つまたは7つのノードをホストします。サービスディスカバリに加えて、コンテナにEtcdを実装するマイクロサービスアーキテクチャも、これらのサービスの登録から恩恵を受けます。
サービス登録の下で、Etcdは必要なキーと値のペアの書き込みを処理します。サービスディスカバリでは、Etcdが作成されたキーと値のペアの読み取りを処理します。
他の作成されたアプリケーションがEtcdと通信するには、confdプロジェクトプロトコルに準拠する必要があります。このプロトコルは、Etcdの保存された情報から静的構成ファイルを作成します。この設定では、実行可能な接続障害を管理し、他の実行可能なサービスインスタンスを介して再接続を作成するのはクライアントの責任です。
履歴書にEtcdを掲載している著名な企業には、CloudGear、Headspace、Red Hat、Kubernetes、Apptus、Zenreach、Cloud Foundry、Googleなどがあります。 Etcdの成長するコミュニティサポートは、このサービス検出ツールのプラットフォームでの開発者のエクスペリエンスを向上させています。
Etcdの設定
構成を保存および取得するEtcdの機能は、オープンソースのKey-Valueストアとしての唯一の主要な機能ではありません。作成されたEtcdクラスターは、可用性が高いため、ノード障害の問題が最小限に抑えられます。保存された値は、REST/gRPCを介してクライアントによって取得されます。
前提条件
次の要件により、Etcdクラスターのセットアップの経験がより実り多いものになります。
- 3つの機能するLinuxサーバーにアクセスできます
- 3つのサーバーの選択肢は、有効なホスト名で構成する必要があります。
- 効果的なピアツーピア通信とクライアント要求を行うには、サーバーの2380ポートと2379ポートをシステムのファイアウォールルールから有効にする必要があります。
LinuxマシンでのEtcdクラスターのセットアップ
Etcdクラスターのセットアップは、特に静的ブートストラップアプローチでは比較的簡単なので、頭痛の種になることはありません。このアプローチで正常にブートストラップするには、ノードのIPを記憶する必要があります。このセットアップガイドでは、マルチノードセットアップを扱っているため、Linuxサーバークラスターを正常に作成するために必要となる可能性のあるすべての手順について説明します。
etcdをサービスとして実行するには、systemdファイルも構成する必要があります。以下は、このセットアップガイドで使用するホスト名とIPアドレスの関係のほんの一例です。
etcd-1 : 10.128.0.7 etcd-2 : 10.128.0.8 etcd-3 : 10.128.0.9
必要な管理者権限がある場合は、サーバーのホスト名を変更して、カスタマイズ可能な設定を反映させることができます。
etcdクラスターのセットアップに取り掛かる時間です。
3つのノード
次の連続する手順は、3つのサーバーノードすべてに適用されます。
ステップ1: 各サーバー端末で、次のコマンドを使用してsrcディレクトリに移動します。
cd /usr/local/src
ステップ2: Githubリリースを参照しているときに、最新のetcdリリースを取得できるはずです。必ず最新の安定バージョンをダウンロードしてください。
sudo wget "https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz"
ステップ3: このステップでは、ダウンロードしたetcdバイナリを解凍します。
sudo tar -xvf etcd-v3.3.9-linux-amd64.tar.gz
ステップ4: untarプロセスは、etcdファイルとetcdctlファイルを生成する必要があります。これらの抽出はetcd実行可能ファイルです。次のコマンドを使用して、それらをローカルbinディレクトリに移動します。
sudo mv etcd-v3.3.9-linux-amd64/etcd* /usr/local/bin/
ステップ5: etcdユーザーにetcdサービスを実行させたいので、etcdユーザー、グループ、およびフォルダーを作成する必要があります。
sudo mkdir -p /etc/etcd /var/lib/etcd groupadd -f -g 1501 etcd useradd -c "etcd user" -d /var/lib/etcd -s /bin/false -g etcd -u 1501 etcd chown -R etcd:etcd /var/lib/etcd
ステップ6: 次のアクションを実行するときは、rootユーザー権限を持っていることを確認してください。
ETCD_HOST_IP=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1) ETCD_NAME=$(hostname -s)
上記のコマンドシーケンスは、2つの環境変数を設定します。最初の環境変数はサーバーのIPアドレスをフェッチし、2番目の環境変数はそのIPアドレスをホスト名に関連付けます。
Etcdにはsystemdサービスファイルが必要です。
cat << EOF > /lib/systemd/system/etcd.service
このサービスファイルを作成したら、次のようにデータを入力します。
[Unit] Description=etcd service Documentation=https://github.com/etcd-io/etcd [Service] User=etcd Type=notify ExecStart=/usr/local/bin/etcd \\ --name ${ETCD_NAME} \\ --data-dir /var/lib/etcd \\ --initial-advertise-peer-urls http://${ETCD_HOST_IP}:2380 \\ --listen-peer-urls http://${ETCD_HOST_IP}:2380 \\ --listen-client-urls http://${ETCD_HOST_IP}:2379,http://127.0.0.1:2379 \\ --advertise-client-urls http://${ETCD_HOST_IP}:2379 \\ --initial-cluster-token etcd-cluster-1 \\ --initial-cluster etcd-1=http://10.142.0.7:2380,etcd-2=http://10.142.0.8:2380,etcd-3=http://10.142.0.9:2380 \\ --initial-cluster-state new \\ --heartbeat-interval 1000 \\ --election-timeout 5000 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF
このファイルの「–listen-client-urls」の部分は、使用されている3つのサーバーIPに置き換える必要があります。セットアップサーバーによって、「– name」、「– listen-peer-urls」、「– initial-advertise-peer-urls」、および「–listen-client-urls」の値は異なります。 ETCD_HOST_IP変数とETCD_NAME変数については、それらの入力値は自動化され、システムによって置き換えられます。
ブートストラップetcdクラスター
上記の手順1から6の構成は、3台のサーバーすべてに適用されます。その後、次のステップは、作成したetcdサービスを開始して有効にすることです。この取り組みは、3つのノードすべてに適用する必要があります。サーバー1は、ブートストラップノードの機能を引き継ぎます。 etcdサービスが稼働すると、リーダーとして1つのノードが自動的に選択されます。したがって、このリーダーノードの構成に関与することを心配する必要はありません。
systemctl daemon-reload systemctl enable etcd systemctl start etcd.service systemctl status -l etcd.service
Etcdクラスターステータスの検証
etcdバイナリをダウンロードした後に以前に抽出したetcdctlユーティリティは、etcdクラスターとの対話を開始する役割を果たします。 3つのノードすべてで、このユーティリティが/ usr / local/binディレクトリにあるはずです。
以下のシステムチェックは、すべてのクラスターノードに適用可能であり、特定のノードに限定されません。最初のチェックは、クラスターのヘルスステータスを確認することです。
etcdctl cluster-health
クラスタノードのメンバーシップステータスを確認および確認して、そのノードがリーダーシップステータスを持っているかどうかを判断することもできます。
etcdctl member list
デフォルトでは、etcdctlを介してetcdv2機能に明示的にアクセスします。これはデフォルトの関連付けです。 etcd v3とその機能にアクセスする場合は、変数「ETCDCTL_API=3」を使用するのが実行可能なオプションです。この変数を実装するには、環境変数として構成します。または、etcdctlコマンドを使用するたびに変数を渡すこともできます。
次のキーと値のペアを作成して検証してみてください。
ETCDCTL_API=3 etcdctl put name5 apple ETCDCTL_API=3 etcdctl put name6 banana ETCDCTL_API=3 etcdctl put name7 orange ETCDCTL_API=3 etcdctl put name8 mango
name7の値にアクセスするには、次のコマンドを実行します。
ETCDCTL_API=3 etcdctl get name7
範囲とプレフィックスを使用することで、以下に示すようにすべてのキーを一覧表示できます。
ETCDCTL_API=3 etcdctl get name5 name8 # lists range name5 to name8 ETCDCTL_API=3 etcdctl get --prefix name # lists all keys with name prefix
Apache Zookeeper
このサービスは、集中化され、分散され、一貫性があると説明できます。 Javaプログラミング言語がその作成に責任を負います。 Apache Zookeeperは、Zabプロトコルを介してクラスターの変更を効果的に管理できます。以前の役割は、ApacheHadoopの世界でソフトウェアクラスターコンポーネントを維持することでした。
ここで、データストレージは、ツリー上、ファイルシステム内、または階層的な名前空間のいずれかにあります。クライアントがこのネットワークに接続されている場合、ノードは引き続き存在します。一方、ネットワークの切断が発生したり、構成されたネットワークに問題が発生したりすると、ノードは消えます。ネットワーク障害または負荷分散の問題が発生した場合、それらを解決するのはクライアントの責任です。 Apache Zookeeperが新しいサービスを登録すると、クライアントはこれらのサービスに関連する通知を受け取ります。
Zookeeperシステムの一貫性は、潜在的なシステム障害からシステムを保護しません。一部のプラットフォームでは、必要なサービスの登録で問題が発生したり、読み取りおよび書き込みサービス機能の実装中にエラーが発生したりする場合があります。一方、Apache Zookeeperは、活気に満ちたユーザーコミュニティと成長するクライアントに利益をもたらす広範なライブラリサポートを備えた、堅牢で確立されたアプリケーションであり続けます。
Apache Zookeeperに関連する有名企業には、Apache Software Foundation、Luxoft、Solr、Reddit、Rackspace、Spero Solutions、F5 Networks、Cloudera、eBay、Yahoo!
などがあります。ApacheZookeeperのセットアップ
Apache Zookeeperは、分散調整ツールとして機能的に適応しているため、さまざまな分散ワークロードの処理に最適です。
前提条件
- 3つの仮想マシン(VM)が必要です。使用するVMの数は3を超える場合がありますが、高可用性クラスターの場合、その数は奇数である必要があります。
- ポート2181、2888、および3888は、VMのインバウンド接続がこれらのポートを介して行われるように、サーバーシステムのIPtablesを介して有効にする必要があります。これらのポートは、ApacheZookeeperの通信を担当します。
AWSなどのクラウドプロバイダーの下で作業する個人は、エンドポイント、またはApacheZookeeperがこれらのポートを操作できるようにセキュリティグループを有効にする必要があります。
ApacheZookeeperのインストールと構成
3つのVMはすべて、次の手順の恩恵を受けるはずです。
ステップ1: サーバーの更新
sudo yum -y update
ステップ2: Javaのインストール。 Javaがすでにインストールされている場合は、この手順をスキップしてください。
sudo yum -y install java-1.7.0-openjdk
ステップ3: 「wget」コマンドを使用してZookeeperをダウンロードします。
wget http://mirror.fibergrid.in/apache/zookeeper/zookeeper-3.5.2-alpha/zookeeper-3.5.2-alpha.tar.gz
ステップ4: ApacheZookeeperアプリケーションを/optディレクトリに解凍します。
sudo tar -xf zookeeper-3.5.2-alpha.tar.gz -C /opt/
ステップ5: Apache Zookeeperアプリディレクトリに移動し、名前を
に変更します。cd /opt
sudo mv zookeeper-* zookeeper
ステップ6: / opt / zookeeper / confディレクトリ内で、zoo.cfgというファイルを操作する必要があります。このファイルを作成し、次の構成データを入力します。
tickTime=2000 dataDir=/var/lib/zookeeper clientPort=2181 initLimit=5 syncLimit=2 server.1=<ZooKeeper_IP/hostname>:2888:3888 server.2=<ZooKeeper_iP/hostname>:2888:3888 server.3=<ZooKeeper_iP/hostname>:2888:3888
3つのZookeeperサーバーは、サーバー1、サーバー2、およびサーバー3で表されます。「ZooKeeper_IP」変数は、3つのサーバーIPアドレスまたはこれらの識別可能なIPアドレスの解決可能なホスト名に置き換える必要があります。
ステップ7: 作成して入力したzoo.cfgファイルは、libというデータディレクトリを指しています。このディレクトリには、zookeeperという別のディレクトリも含まれています。このディレクトリはまだ存在しないため、作成する必要があります。
sudo mkdir /var/lib/zookeeper
ステップ8: 上記で作成したディレクトリ内に、myidファイルを作成します。
sudo touch /var/lib/zookeeper/myid
ステップ9: このmyidファイルは、各ApacheZookeeperサーバーを識別するための一意の番号を保持します。
Zookeeperサーバー1の場合
sudo sh -c "echo '5' > /var/lib/zookeeper/myid"
Zookeeperサーバー2の場合
sudo sh -c "echo '6' > /var/lib/zookeeper/myid"
Zookeeperサーバー3の場合
sudo sh -c "echo '7' > /var/lib/zookeeper/myid"
ApacheZookeeperサービス構成
Zookeeperを開始および停止するには、スクリプトを利用する必要があります。ただし、これらのスクリプトをサービスとして実行すると、スクリプトをより適切に管理できます。 zkServer.shファイルを開く必要があります。
sudo vi /opt/zookeeper/bin/zkServer.sh
「#!/ usr / bin / env」の下にある開いたファイルには、次のデータが入力されます。
# description: Zookeeper Start Stop Restart # processname: zookeeper # chkconfig: 244 30 80
同じzkServer.shファイルで、ライブの「#use POSTIX interface、symlink…」をトレースします。その行に続く変数をこれらの値に置き換えて置き換えます。
ZOOSH=`readlink $0` ZOOBIN=`dirname $ZOOSH` ZOOBINDIR=`cd $ZOOBIN; pwd` ZOO_LOG_DIR=`echo $ZOOBIN`
Zookeeperサービスにシンボリックリンクが必要になりました。
sudo ln -s /opt/zookeeper/bin/zkServer.sh /etc/init.d/zookeeper
ブートメニューはZookeeperに対応している必要があります。
sudo chkconfig zookeeper on
次のコマンドを使用して、3台のサーバーすべてを再起動する必要があります。それぞれの端末で実行します。
sudo init 6
サーバーが再起動すると、次のコマンドシーケンスを使用してサーバーを簡単に管理できます。
sudo service zookeeper status sudo service zookeeper stop sudo service zookeeper start sudo service zookeeper restart
Zookeeperのステータスを確認するコマンドを実行すると、端末の出力は次のようになります。
/bin/java ZooKeeper JMX enabled by default Using config: /opt/zookeeper/bin/../conf/zoo.cfg Client port found: 2181. Client address: localhost. Mode: leader
3台のサーバーのうち1台にはリーダーモードが割り当てられ、他の2台にはフォロワーモードが保持されます。
最後のメモ
サービス検出は、高可用性と障害検出という2つの重要な目標を果たします。より多くの機能がキューにあるため、Consul、Etcd、Apache Zookeeperなどのサービス検出ツールを認識して構成しない限り、インフラストラクチャの実装を完了することはできません。これらのツールはオープンソースであり、サービス提供機能において基本的に効果的です。したがって、Linuxシステムで単純なサービス検出メカニズムをテストまたは実装しようとして壁にぶつかることはありません。