deha magazine / システム開発 / 一般的なシステム統合プロトコルについて
一般的なシステム統合プロトコルについて
2020/06/12
システムを設定する時、Low Couplingと High Cohesionを満たすことを確保するように、システムを小さなモデルに分けることが多いです。
または、システムを小さなサービスを分けて組み合わせることも多いです。
これにより、システムのスケーリングが簡単になり、システムのフォールトトレラントも確保することができます。
しかし、上記のようにシステムを分割すると、統合に関する問題が発生してしまうことも…。
システムを一緒にスムーズに稼働するためには、適切な組み合わせを選択するべきです。この記事ではそんな適切なシステム統合プロトコルについて紹介していきます。
- 適切なシステム統合プロトコルについて知りたい方
- 社内のIT人材が不足している方
これらに当てはまる方におすすめの記事となっています。これを読めばシステム統合プログラムについて丸わかりですよ。
一般的なシステムの組み合わせ方法の例
PHP と MySQL組み合わせ
PHPとMySQLは異なるテクノロジーです。(PHP:プログラミングの言語 MySQL:データベース管理のシステム)。
開発の時にPHPとMySQLを接続する必要があります。PHPはMysqli、 PDO等のMySQLへ接続できるようにいくつかの方法をご紹介します。アクセス方法とデータベース処理を提供する拡張機能です。
MySQLへの接続の為、ホスト、ポート、ユーザー名、パスワード等のいくつかのパラメータを宣言しましょう。
他のパラメータを無視して、ホストとポートを注意してください。
MySQLは tcp/socketでサーバーへのアクセス方法を提供します。これはシステムにアクセスして、組み合わせる為のプロトコルです。ほとんどプログラミング言語とデータベースがこのプロトコルをサポートしています。
MySQLサーバーが実行される時、サーバソケットがポート3306(MySQLのデフォルトのポート)待機します。このポートへのアクセスがある場合(PHP等から)、依頼情報によりMySQLが結果を返します。
ソケットが2つの通信仕組みを提供します。1つは仮想的なポートを使用します(ポート3306)。もう1つはソケットのファイルシステムを使用します(UNIXソケット)。
このファイルがシステム内のプロセス間の内部的な通信を担当します(1つのプログラムが複数のプロセスを含む)。
UNIXソケットのファイルは同じサーバ上に2つのプロセスがある時の使用可能性です。PHPとMySQLが異なるサーバ上にある場合、仮想的なポートのみを組み込み使用することができます。
PHP と NGINXの組み合わせ
NGINXがWebサーバー、 Proxy、 Load Balancer等のシステムに多くの影響を与えます。
基本的に、NGINX と PHPを連携する方法はPHPとMySQLに似ています。これらはソケットによって通信します。
NGINXを使用する為、PHP-FPMという特別なPHPのバージョンが必要です。NGINX と Apache仕様管理の仕組みが異なりますので、この問題ができるようにPHPのバージョンが必要です。
PHP- FPMはローカルアクセスまたはリモートアクセスの為にポート9000またはUNIXソケットのファイルを開きます。
Docker Client と Docker Machine
Dockerには、 Command Line Interface (CLI) の使用は Docker Clientに作業しているということです。
コマンドを入力する時、Docker Clientが RESTful標準に従ってDocker Machineへコマンドを送信します。
しかし、送信の仕組みがHTTPではなくソケットです。
それから、 Docker Machine へソケットができるウェブサイトを作成することに基づき、Docker管理プログラムが構築できます。
Docker Composeシステム
まず、Docker Composeによって実行される各サーバが個別のサーバ―であることを理解することが必要です。
つまり、このサーバーのプロセスが他のサーバーのプロセスを呼び出すことができません。他のネットワークプロトコルを通じることで通信することができます。
通信できるように、これらのサービスが同じネットワーク上にある必要があります(Overlay Networkと呼ばれる)。
このネットワークがDocker 自体によって作成され、そのネットワークにコンテナを付けます。その時、付かれるサービスの名がhostnameになります。
例えば、 PHPサービスがSocket portを通じてMySQLを呼び出せるように、MySQLとポート3306という hostnameを宣言するべきです。
なお、NGINX と PHPに対するPHPとポート9000というhostnameを宣言するべきです。
一般的なシステムの組み合わせる方法
HTTP Protocol
これは現在の世界を支配するプロトコルです。これらはウェブサイト、ビデオ、写真等のネットワークリソースへのアクセスをサポートできます。
ステートレスはHTTPの特殊です。これは初めてのクライアントがサーバーへ依頼を送信した時、二回目まで、サーバーはこのクライアントが依頼を送信するかどうか分からないということです。
このデメリットを克服する為、Session、Cookie、LocalStorage、 Json Web Token等が効果的です。(HTTPがステートフルになる為)。これにより、サーバーが書くクライアントが区別できます。
各システムがサービスという役割を果たします。したがって、Webサービスがあります。
SOAPという標準の通信プロトコルを使用することが以前は多かったそうです。SOAPもHTTP(Web)及びSMTP(Mail)プロトコルの両方で使用することができます。
その後2000年以降、RESTという1つの標準を発明されました。
この標準を使用するシステムが RESTful Serviceと呼ばれます。これは現在Web APIで一般的に使用する標準です。RESTの本質はStatelessですので(以上の通りに言った)、各クライアントのAuthenticateの為Web Tokenを使用します。
TCP Socket Protocol
前述したように、ソケットはとても古典的なプロトコですが、現在でもかなり使用されています。
ここではTCPソケットのみ考慮されます。TCPソケットのプロトコルには、2台の機械が相互に接続し、情報を送信したい場合絶えず接続を作成しましょう。
なお、UDPという他のプロトコルもあります。このプロトコルはもっと高速で、接続を作成する必要がありません。しかし、パケットの受信が確認できないので信頼性が低いです。
RPC – Remote Produce Call
これはリモート関数を呼び出すための手法のことです。
この関数が現在のプログラムがないので、サーバーまたは他のプログラムを実行するべきです。
例えば、内部のチャートプログラムがある場合、ユーザーの登録を実行する為のクライアント確認のザーバーを構築していきましょう。クライアントは確認を依頼する時、サーバーへリクエストを送信します。このリクエストがRPCと呼ばれます。
RESTful Serviceを設計する時、ログイン、ログアウト等の機能がRPCと見なします。
基本的に、RPCはRESTと同じように通信設計のことを指します。HTTP Protocol または TCP Socketでこの仕組みが実装できます。
現在、RPCは複数のサーバーから関数を呼び出す必要がある高性能化問題によく使用されます。
その中では Thrift 及び gRPCという2つのRPCフレームワークが一番有名です。
これはユーザーがサーバーと遠隔手続き呼び出しが構築できる2つフレームワークです。Thrift及びgRPCはRPC実行が簡単になるため安易なインタフェースを提供します。
現在、ThriftはFacebookに使用されています。ちなみに、gRPCはサービス統合用のGoogleに使用されています。
Message Queue
Message Queueは分散システムの重要なテクノロジーです。分散システムは複数のサーバー、救数のサービス、複数のデータベースを含みます。
これらはお互いに連携し、動作します。良い1つの分散システムはCAP Theoremを確保する必要のシステムです。
サービス数が増えると、サービス間の通信が混乱になります。
メッセージキューは別のサーバーで遠隔手続き呼び出しまたはリソースコードへの呼び出しが1つのメッセージと見なすという提案します。その後、メッセージブローカは構成され、各サービス間でメッセージを通信することができます。
メッセージブローカはAMQP プロトコルを実装することが多いです。これは分散システムでメッセージの送受信に関する専門があるプロトコルの一つです。
まとめ
いかがでしたか。この記事では一般的なシステム統合プロトコルについて紹介していきました。
さまざまな組み合わせがあり、それぞれに特徴がありましたね。
dehaでは、5年ほど前から、ベトナムオフショア開発を行っています。
システム統合の為のメッセージブローカとしてKafkaを導入しています。本日紹介したシステム統合プロトコルについてや、Kafkaに関してなど興味がある方はぜひご気軽にお問い合わせください。