TOP テクノロジーPHP 一般的なシステム統合プロトコルについて

一般的なシステム統合プロトコルについて

by Van Nguyen
0 コメント

システムを設定する時、Low Couplingと High Cohesionを満たすことを確保するように、システムを小さなモデルに分けることが多いです。または、システムを小さなサービスを分けて組み合わせることも多いです。これにより、システムのスケーリングが簡単になり、システムのフォールトトレラントも確保されます。
しかし、上記のようにシステムを分割すると、統合に関する問題が発生される可能性もある。システムを一緒にスムーズに稼働するのがどうすればよいか?適切な組み合わせを選択するのがどんな方法でしょうか。以上の問いをが本の記事に解明されます。

1. 一般的なシステムの組み合わせる方法の例

1.1  PHP と MySQL組み合わせ

PHPとMySQLは異なるテクノロジーです。(PHP:プログラミングの言語 MySQL:データベース管理のシステム)。明らかに、開発の時にPHPとMySQLを接続する必要があります。PHPはMysqli、 PDO等のMySQLへ接続できるようにいくつかの方法を供給します。これはアクセス方法とデータベース処理を提供する拡張機能です。

MySQLへの接続の為、ホスト、ポート、ユーザー名、パスワード等のいくつかのパラメータを宣言するべきです。他のパラメータを無視して、ホストとポートを注意してください。MySQLへの接続時にホストとポートが必要なのはなぜか?ここで接続方法は何でしょうか?

MySQLは tcp/socketでサーバーへのアクセス方法を提供します。これはシステムにアクセスして、組み合わせる為のプロトコルです。ほとんどプログラミング言語とデータベースがこのプロトコルをサポートしています。

MySQLサーバーが実行される時、サーバソケットがポート3306(MySQLのデフォルトのポート)待機します。このポートへのアクセスがある場合(PHP等から)、依頼情報によりMySQLが結果を返します。

ソケットが2つの通信仕組みを提供します。1つは仮想的なポートを使用します(ポート3306)。2つはソケットのファイルシステムを使用します(UNIXソケット。このファイルがシステム内のプロセス間の内部的な通信を担当します(1つのプログラムが複数のプロセスを含む)。

注意してあるが、UNIXソケットのファイルは同じサーバ上に2つのプロセスがある時の使用可能性です。PHPとMySQLが異なるサーバ上にある場合、仮想的なポートのみを組み込め、使用できます

1.2  PHP と NGINXの組み合わせ

ご存知の通り、NGINXがWebサーバー、 Proxy、 Load Balancer等のシステムに多く影響を与えます。基本的に、NGINX と PHPを連携する方法はPHPとMySQLに似ています。これらはソケットによって通信します。

NGINXを使用する為、PHP-FPMという特別なPHPのバージョンが必要です。NGINX と Apache仕様管理の仕組みが異なりますので、この問題ができるようにPHPのバージョンが必要です。

PHP- FPMはローカルアクセスまたはリモートアクセスの為にポート9000またはUNIXソケットのファイルを開きます。

1.3 Docker Client と Docker Machine

Dockerには、 Command Line Interface (CLI) の使用は Docker Clientに作業しているということです。コマンドを入力する時、Docker Clientが RESTful標準に従ってDocker Machineへコマンドを送信します。しかし、送信の仕組みがHTTPではなくソケットです。

それから、 Docker Machine へソケットができるウェブサイトを作成することに基づき、Docker管理プログラムが構築できます。

1.4 Docker Composeシステムのサービスがどのように相互に通信しますか。 

まず、Docker Composeによって実行される各サーバが個別のサーバ―であることを理解することが必要です。つまり、このサーバーのプロセスが他のサーバーのプロセスが呼び出せません。他のネットワークプロトコルを通じて通信できます。

通信できるように、これらのサービスが同じネットワーク上にある必要があります(Overlay Networkと呼ばれる)。このネットワークがDocker 自体によって作成され、そのネットワークにコンテナを付けます。その時、付かれるサービスの名がhostnameになります。

例えば、サービスの名がPHPとMySQLのです。 PHPサービスがSocket portを通じてMySQLを呼び出せるように、MySQLとポート3306という hostnameを宣言するべきです。

なお、NGINX と PHPに対するPHPとポート9000というhostnameを宣言するべきです。

2. 一般的なシステムの組み合わせる方法

2.1 HTTP Protocol

これは現在の世界を支配するプロトコルです。これらはウェブサイト、ビデオ、写真等のネットワークリソースへのアクセスをサポートできます。

ステートレスはHTTPの特殊です。これは初めてのクライアントがサーバーへ依頼を送信した時、二回目まで、サーバーはこのクライアントが依頼を送信するかどうか分からないということです。

このデメリットを克服する為、Session、Cookie、LocalStorage、 Json Web Token等のことを思い付きました(HTTPがステートフルになる為)。これから、サーバーが書くクライアントが区別できます。

HTTPから、いくつかのシステム総合の規則を思い出しました。その時に、各システムがサービスという役割を果たします。したがって、Webサービスがあります。

以前、SOAPという標準の通信プロトコルを使用することが多いです。SOAPもHTTP(Web)及びSMTP(Mail)プロトコルの両方で使用できます。

その後2000年以降、RESTという1つの標準を発明しました。この標準を使用するシステムが RESTful Serviceと呼ばれます。これは現在Web APIで一般的に使用する標準です。RESTの本質はStatelessですので(以上の通りに言った)、各クライアントのAuthenticateの為Web Tokenを使用します。

2.2 TCP Socket Protocol

以上のように、ソケットはとても古典的なプロトコですが、現在でもかなり使用しています。ここではTCPソケットのみ考慮されます。TCPソケットのプロトコルには、2台の機械が相互に接続し、情報を送信したい場合絶えず接続を作成するべきです。なお、UDPという他のプロトコルもあります。このプロトコルはもっと高速で、接続を作成する必要がありません。しかし、パケットの受信が確認できないので信頼性が低いです。

今後、ウェブが開発された時Websocketという新テクノロジーが発明されます。理解通りのウェブに情報を伝達し、送信する為のHTTP Protocol Method (GET、POST、PUT等)を実装する必要があります。クライアント間でのチャートプログラムを作成したい場合、POSTまたは PUTでリクエストを継続的に送信するべきです。しかし、2020年になって、これがまだ導入されません。Websocketがソケットと同じように仕組みを提供します。それはサーバーへ接続を直接的に作成します。この接続が片側に終了のまでに継続的に維持されます(接続が閉じる)。これは各リクエストを送信する時レイテンシーを減少します。また、クライアントから各リクエストを処理する時のサーバー負荷を減らします。

2.3 RPC – Remote Produce Call

これはリモート関数を呼び出すための手法のことです。この関数が現在のプログラムがないので、サーバーまたは他のプログラムを実行するべきです。例えば、内部のチャートプログラムがある場合、ユーザーの登録を実行する為のクライアント確認のザーバーを構築するべきです。クライアントは確認を依頼する時、サーバーへリクエストを送信します。このリクエストがRPCと呼ばれます。

 RESTful Serviceを設計する時、ログイン、ログアウト等の機能がRPCと見なします。

基本的に、RPCがRESTと同じように通信設計のことです。HTTP Protocol または TCP Socketでこの仕組みが実装できます。

現在、RPCは複数のサーバーから関数を呼び出す必要がある高性能化問題によく使用しています。その中に Thrift 及び gRPCという2つのRPCフレームワークが一番有名です。これはユーザーがサーバーと遠隔手続き呼び出しが構築できる2つフレームワークです。例えば、PythonプログラムがPHPで実行するプログラムに関数を呼び出したいことはどすれば良いでしょうか?理解通りのTCPソケットを使用ましたがソケットがプロトコルであり、システム統合標準を指定せずに基本的なストリングのデータ構築のみをサポートします。さらに、TCPソケットがデータが限られるだけでなく、各言語では書き方が異なります。ソケットでプログラムを構築することは悪夢です。

Thrift及びgRPCはRPC実行が簡単になるため安易なインタフェースを提供します。現在、ThriftはFacebookに使用しています。なお、gRPCはサービス統合用のGoogleに使用しています。

2.4 Message Queue

これは分散システムの重要なテクノロジーです。なぜでしょうか?

分散システムは複数のサーバー、救数のサービス、複数のデータベースを含めます。これらはお互いに連携し、動作します。良い1つの分散システムはCAP Theoremを確保する必要のシステムです。

サービス数が増えると、サービス間の通信が混乱になります。

メッセージキューは別のサーバーで遠隔手続き呼び出しまたはリソースコードへの呼び出しが1つのメッセージと見なすという提案します。したがって、各サービス間の管理・通信がメッセージ管理と同じです。それ以来、メッセージブローカは構成され、各サービス間でメッセージを通信する機能があります。

メッセージブローカはAMQP プロトコルを実装することが多いです。これは分散システムでメッセージの送受信に関する専門があるプロトコルの一つです。

一般のメッセージブローカ:RabbitMQ、 ZeroMQ、 ActiveMQ、 Kafka、 MSMQ、 SQS…

現在のメッセージブローカはサーバー上での実装プログラムです。あるいは、それは既にインストールされるサービスです(SQSまたはMSMQ)。

まとめ

DEHA Technologiesは システム統合の為のメッセージブローカとしてKafkaを導入しています。次の記事ではKafkaについて詳細的に説明されていただきます。

以上の情報について、お役立ていただければ幸いです。

関連記事