アプリを開発する言語として選ばれていることはみなさんご存知でしょう。動作するサーバーサイドアプリケーションを開発するのにも優れた言語としても浮上してきました。++などの言語による、パフォーマンスに最適化されたネットワークフレームワークが使われています。サーバーインフラストラクチャーチームが長年の経験を活かし、どのように高性能でスケーラビリティの高いネットワークアプリケーションを作成して、どのように開発時にSwiftを利用しているかについて説明します。networkingについて、バズワードでもあるので説明したいと思います。非同期が何故大事なのか答えは簡単、リソースを最大限使いたいと思うだろうからですサーバーとモバイルの間での読み書きはおもったよりも低い頻度で起きていて、常にIO待ちとなってしまう。非同期でないネットワーキングプログラムではスレッド、コネクションを一つ作成するか、コネクションごとにスレッドを用意するということになると思います。IOオペレーションがスレッドの一つをブロックするとたちまち困ってしまいます。こちらなら一つのスレッドが複数のコネクションを管理できます。これまでIOに持っていた前提条件が壊れることになります。データの中で怒ってからデータが返ってくるという前提は壊れます。ネットワークサービス全体が大きく複雑化してしまいます。この複雑さを許容しようとする理由を理解するには、常にトレードオフがあるが、ハイスケールサービス(システム)を口にする時、数百から数千を同時に処理しなければならなくなるということがあるのを理解する必要があります。スレッドを使うとコストはある。メモリオーバーヘッドしたとしても、他にもパローマンスコストになることがある。OSが一つのスレッドで進展する時にOSのスケジューラーに処理されるが、インパクトが一番大きいのは、必ずそのスイッチのコンタクトが必要だということです。最悪、になるのは、CPUコアのキャッシュの廃棄です。オペレーションは高速だったが、このトラッシングによりスローに鳴ってしまう。キャッシュがないからデータが底にアクセス出来ないということになる。した複雑性をどう解決していくか。IOを使っていきましょうJVMや他の言語では、ネッティー(?)の開発に投資をしているここで、もしかしたら新しいものを作ったほうがいいかもという話になりました。SwiftNIOと言うものです。Swift用のNettyだと思って下さいこれまで成功してきたとおり、柔軟なのに、これまでは複雑でした。AppleはNettyで多くの経験を積み、複数の人間がNettyプロジェクトに関わっています。Nettyは大きな人気の高いプロジェクトApacheやNoSQLデータベース、Sparkなどが使っています。GRPCも使っています。実証済みのAPIになりということです。本当に最後に申し上げたいのはNettyは既に経験がある人にとって容易になるということです。Swiftの探索がとても簡単になります。JVMのユースケースと似ているわけですから。低レベルネットワーキングフレームワークですTCPプロキシなども使えますし、DNSサーバーなどもそうです。高レベルフレームワークではありません。KituraやVaporではありませんそのひとつ下のレイヤーです。殆どのユーザーは直接使わないでしょう。その上に構築されたフレームワークを使うことになります。簡単に説明していきますイベントループグループがありますスレッドプールと考えてもいいでしょう。一つのイベントループは一つが専用のスレッドを持つ。これが大事な理由は後で話す。チャネルそのものがエンドポイントを抽象化したものです。それが何を意味するかは実装に関わります。ソケットのように考えて良いと思います。TCPやUDPなどです。チャネルパイプラインがあります。チャネルにアサインされます。チャネルパイプラインは複数のチャネルハンドラを持ちます。ハンドラそのものはロジックの処理をさせてくれます。インバウンド、アウトバウンドデータをインターセプトできます。ブートストラップとかもあります。チャネルをセットアップします。コンテナはデータストラクチャをコピーします。高度なオペレーションができます。writeの機能があるので関数から関数に渡すのも簡単にできます。イベントループの図式ですイベントループと読んでいますが無限ループの中で実行されています。シャットダウンもあるのですが。様々なイベントタイプを収集処理していきますlイベントループは複数の処理を扱うことができます。一つのスレッドでコネクションを多重化する必要があるからです。すべてのチャネルからコネクションをアクセプトしますこれが終わるとタスクのキューに入ります。それを継続できるまでブロックします。これがここの基本的な考え方です。興味深いとkロオへ行きましょうこれがチャネルパイプラインです。基本的に、複数扱うことができますモバイルデバイスで十分読み込めない時はとめてメモリ稼働率を高める。BackPressureHandlerで。この3つの構成要素があって、完全なechoサーバーができます。暗号化もされています。あんごうかが不要ならOpenSSLハンドラをれムーブすれば良いです。チャネルハンドラは2つのコールバックがあります。パイプラインにAddされたのとRemoveされた時。インバウンドハンドラメソッドが幾つかあります。チャネルがアクティブになった時、Inactiveは接続がKillされた時。ChanelReadは読み出される時、ReadCompleteは終わった時。ErrorgaおきたCaughtOutboundは逆Promissというのはオペレーションが終わると呼び出されるもの例ですflushというのはSysCall内のデータをすべて捨てる。サーバーをマウントしていくパイプラインをOnTheFlyでできるプロトコルのアップデートなどをハンドラーのリムーブをしながらできるSwiftNIOがエコシステム全体にどのような影響があるのかNettyと同じようなものかと思いますすでにSwiftコンパイラチームに最適化するように言っています。はてなブログPro大学時代に耳が聞こえない生徒が講義に参加できるようにリアルタイムに文字起こしするバイトをしていました。いまはエンジニアとして働きつつ、勉強会やカンファレンスで話される技術分野の知見を文章に残し、検索可能にしたり、地方で活動する方に届けたいと思っています。お役に立ちましたら、支援いただけると幸いです。(24)注目記事はてなブログをはじめよう!niwatakoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。