サーバーエージェントインターンまたインターン「何社目だよ!!」とツッコミ入れていただいた方ありがとうございます。このインターン自体は昨年の7月から決まっていたので、決まってから随分たったなという感じですね。期間は2/1~2/28ですfreshlive.tv何をしたのかマイクロサービス間のポーリングを無くす、ミドルウェアを作成することが、僕の一ヶ月のタスクでした。いうものを作りました。Freshにはイベント配信基盤のplasmaというものがありまして、それを応用活用して作りました。upamune.hatenablog.comここで疑問が生まれます。plasmaはイベントすうに対してスケールすることができない仕組みをしているため、高頻度でポーリングを行うイベント通信(動画のキャッシュ部分など)では使いづらいという問題点がありました。スケールするplasmaを作りたい!!!まず要件を考える中二つの問題点がありまして、clientが複数接続を張る必要がある。neoplasmaがイベント通知を行える状態にない場合イベントを受け取れる状態にないときは、ロードバランサからイベントが飛んできてしまった場合ロードバランサに送り返します。新規neoplasma-client立ち上がるときk8sマスターにneoplasamのdeploymentsの接続先リストをもらうもらって来た接続先に接続をはる(grpc)実装的には、1はk8sに依存しているのでインターフェースとしては2のみを作っています。スケールアウトしたneoplasmaに接続する新規neoplasmaの所属するdeploymentsに対して自分の状態を送る別のneoplasmaに送られる送られて来たイベントをneoplasma-clientに対して送る状態を送った先にコネクションをはりますneoplasmaは常に数秒おきに自分のDeploymentsに対して、自分の接続情報を送っています。無限ループの可能性は0ではないですが、確率的に低いので許容範囲としています。状態イベントには接続先情報があるのでそこにneoplasma-clientは接続していきます。スケールアウトしたneoplasmaがイベント処理が行えるようになるとき新規neoplasmaの所属するdeploymentsに対して自分の状態を送る別のneoplasmaに送られる。受け取ったneoplasmaは送って来た先にneoplasmaに対して、自身の接続状態を送ります。送られて来たものと同等の状態の場合、正常のイベント処理を始めます。4の時、送られてきた接続状態と自分の接続状態を比較して、大丈夫そうならイベント処理を行いますが、ダメなら、1のように送り返します。足りない接続を検知し、そこに繋ぎに行きます。これで、行けた!!!と思いますが、そうではありません、これはまだ、クラスタ内の話なので、次に外部との接続の話です。クラスタから外部クライアントpodでスケールアウトできるようになったけどまだパブリックに入っていないのでそうしたいのですがい問題があります。k8s内は仮装環境なので、ポートはなんとかなるが、外部との接続はポート限られているので、pod一個ずつ開けることはできまっせん、そこでk8sのserviceを使って、NodePortを開けたとしても、grpcの接続はNodeportに繋がっているどれかのpod一つにしか繋がりません。こいつは何かと言いますと、proxyの役割を持っています。neoplasam-client群(deployments)でポートを持てば、外部クライアントは接続先を特にきにする必要はないplasma-client群で全てのneoplasmaへの接続を持つneoplasma-client自体もスケールアウトする振り分け判定がないので、負荷は低いnode数依存になっても管理しきれる想定なのでこうなります。簡略さした図でイベントの流れを以下のようになりますロードバランサがイベントを振り分ける振り分けられた先のdeploymentsの中のどれかのneoplasmaにへ振り分けられる別のdeploymentsにもデータを流すneoplasma-cliet群へ投げるNodeportを通って外部へクラアントへ飛ばします。これによって、neoplasmaのpodのスケールをして、一つのdeploymentでは接続数が耐えられなくなったら、接続を分散するために、deploymentsを増やすことと、neoplasma-clientを増やして対応します。これで、ポーリングをまたさらに減らして平和な世界へと近づくことができました!(多分)まとめるとだらだらと動きを説明しましたが、二段階のスケールし、イベント処理をするneoplasma群と外部と繋げてよしなにやってくれるneoplasma-clientを作ったということです!!!感想k8sは、ほぼほぼ初見で、社内の資料や、公式ドキュメントもめちゃくちゃあさりましたし、Deploymentsの概念の理解と、service,ingressの理解などが割と手間取りました。あとは設計もあーでもないこーでもないと、一人ホワイトボードと向き合いながら考える日々で、ほとんどコードは書いていないのですが、初めてこんなに時間をかけて真剣に設計をして、設計の重要性と大変であることが学べました。最後に関わってくれた、Freshの皆さん、ランチや飲みに連れてってくれたサイバーの方々ありがとうございました!またおはないしできることを楽しみにしています!!!3/1からは、DMMのネクストカレンシーシーでお世話になるので、会社での業務以外のことなどは、4月にまとめて書きたいと思います。サーバーエージェントインターン2018年の始まりだ!!!!!月別アーカイブ参加グループプログラミングはてなブログをはじめよう!shota-df-412さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。