1 楽楽楽楽楽楽 楽楽楽 楽楽楽楽楽楽 G 楽楽 楽楽 |2022楽7楽3楽 楽楽楽楽楽楽 WEB 楽楽楽楽楽楽楽 Cockatoo
1楽天株式会社 開発部 アーキテクト G 窪田 博昭 |2023年4月13日
クラウド対応WEB フレームワーク
Cockatoo
2
目次
3
目次• WEB サイト・システム構成の変遷
– MVC キャスト– PHP の世界– クラスタ化の始まり– クラスタ化の始まり(並行処理)– API クラスタ– 分散 DB
– C10K
– そしてクラウドへ
• PHP クラウドへ• Cockatoo
– Cockatoo 概要– Cockatoo 構成例– Cockatoo シーケンス
4
WEB サイト・システム構成の編成
5
MVC モデル
6
MVC モデル
インターネットインターネット
サーバーController
View
Model
HTTP リクエスト
ロジック指示表示項目
表示指示
HTTP レスポンス
7
PHP の世界
8
PHP の世界
インターネットインターネット
サーバー
WEB
Controller
View
Model
HTTP リクエスト
ロジック指示表示項目
表示指示
HTTP レスポンス
DB
9
PHP の世界
• PHPに限らず大抵のWEBサイトはこの構成• PVが少なければ問題ない• 運用が楽
All in one 構成
PHP
• 非常に効率がいい• フレームワークの選択肢も豊富。ライバルは Rails のみ
10
PHP の世界
• PHPに限らず大抵のWEBサイトはこの構成• PVが少なければ問題ない• 運用が楽
All in one 構成
終焉
• PV が増えてくると簡単に限界に達する• でも1台で捌けなくなって来るとちょっと嬉しい
PHP
• 非常に効率がいい• フレームワークの選択肢も豊富。ライバルは Rails のみ
11
PHP の世界
インターネットインターネット
サーバー
WEB
Controller
View
Model
HTTP リクエスト
ロジック指示表示項目
表示指示
HTTP レスポンス
この辺りがボトルネック
DB
12
DB サーバ
PHP の世界
インターネットインターネット
サーバー
WEB
DB
Controller
View
Model
HTTP リクエスト
ロジック指示表示項目
表示指示
HTTP レスポンス
13
PHP の世界
• 手っ取り早く追い出せるDBを追い出した形• DB自体が重いのでこれだけでも効果的• 運用もそれ程変わらない• DB自体はまだまだ余裕
WEB + DB 構成
PHP
• スタンドアロン型フレームワークで楽出来るのはここまで
14
PHP の世界
• 手っ取り早く追い出せるDBを追い出した形• DB自体が重いのでこれだけでも効果的• 運用もそれ程変わらない• DB自体はまだまだ余裕
WEB + DB 構成
終焉
• PHP のロジックがボトルネックになってくる• この先は辛く厳しい道のり・・・
PHP
• スタンドアロン型フレームワークで楽出来るのはここまで
15
DB サーバDB
PHP の世界
インターネットインターネット
サーバー
WEB
Controller
View
Model
HTTP リクエスト
ロジック指示表示項目
表示指示
HTTP レスポンス
ボトルネック
16
クラスタ化の始まり
17
DB サーバDB
クラスタ化の始まり
インターネットインターネット
18
DB サーバDB
クラスタ化の始まり
インターネットインターネット
セッションDB
19
クラスタ化の始まり
• 並列化によりPHPロジックのボトルネックを克服• 同時にWEBサーバの冗長化も達成して安定化• だんだん運用が・・・
WEB クラスタ+ DB 構成
PHP
• セッションレプリケーションを自前で書く事になる• 大体のサイトはココ迄で事足りる
20
クラスタ化の始まり
• 並列化によりPHPロジックのボトルネックを克服• 同時にWEBサーバの冗長化も達成して安定化• だんだん運用が・・・
WEB クラスタ+ DB 構成
終焉
• DB が悲鳴を上げ始める• キャッシュ DB ( memcached など)導入は延命治療に過ぎません
PHP
• セッションレプリケーションを自前で書く事になる• 大体のサイトはココ迄で事足りる
21
DB サーバDB
クラスタ化の始まり
インターネットインターネット
ボトルネック
セッションDB
22
DB サーバDB
クラスタ化の始まり
インターネットインターネット
ボトルネック
セッションDB
キャッシュDB
23
クラスタ化の始まり(並行処理)
24
クラスタ化の始まり(並行処理)
25
クラスタ化の始まり(並行処理)
26
クラスタ化の始まり(並行処理)
• 単一リクエストの処理速度が頭打ち・・・• 多くの処理が必要な複雑なページではレスポンスが確保できない• ポータルTOPページや、最初は非表示でJS制御するページなど
WEB クラスタ+ DB 構成
PHP
• そもそも PHP はコンパイル型の言語より処理能力が低い• PHP は並行処理が難しい(ワーカスレッドで解決できない)
27
クラスタ化の始まり(並行処理)
• 単一リクエストの処理速度が頭打ち・・・• 多くの処理が必要な複雑なページではレスポンスが確保できない• ポータルTOPページや、最初は非表示でJS制御するページなど
WEB クラスタ+ DB 構成
終焉
• レスポンスが遅いよ~~• というか PHP はここ迄の規模をスコープしてない気がする・・・
PHP
• そもそも PHP はコンパイル型の言語より処理能力が低い• PHP は並行処理が難しい(ワーカスレッドで解決できない)
28
DB サーバDB
クラスタ化の始まり(並行処理)
インターネットインターネット
セッションDB
キャッシュDB
ボトルネック ボトルネック ボトルネック
29
API クラスタ
30
DB サーバDB
API クラスタ
インターネットインターネット
セッションDB
キャッシュDB
API API API
31
API クラスタ
API API API API API API API API API API
32
API クラスタ
• ロジック部分を切り出しAPI化した形• 処理の共通化も同時に実施でき開発効率UP• WEBサーバの冗長化、ロジック並列化&冗長化を実現
WEB クラスタ+ API クラスタ+ DB 構成
PHP でやるの?
• PHP で非同期リクエストは一般的で無い( curl_multi とか?)• Java などでは一般的な構成( SOAP 、 JSON など)• フレームワークを使っててもレンダリングエンジンしか残らない?
33
API クラスタ
• ロジック部分を切り出しAPI化した形• 処理の共通化も同時に実施でき開発効率UP• WEBサーバの冗長化、ロジック並列化&冗長化を実現
WEB クラスタ+ API クラスタ+ DB 構成
終焉
• DB の限界まではイケるでしょう
PHP でやるの?
• PHP で非同期リクエストは一般的で無い( curl_multi とか?)• Java などでは一般的な構成( SOAP 、 JSON など)• フレームワークを使っててもレンダリングエンジンしか残らない?
34
DB サーバDB
API クラスタ
インターネットインターネット
ボトルネック
セッションDB
キャッシュDB
API API API
35
分散 DB
36
分散 DB
インターネットインターネット
セッションDB
API API API
分散DB
分散DB
分散DB
分散DB
37
分散 DB
• MongoDB , Cassandra , Redis, Hibari など• 極端なサーバ数じゃなければこれで大丈夫
WEB クラスタ+ API クラスタ+分散 DB 構成
とことん PHP
• かなり大規模なサイトの話• KVS や分散 DB の ORM など殆ど無い
38
分散 DB
• MongoDB , Cassandra , Redis, Hibari など• 極端なサーバ数じゃなければこれで大丈夫
WEB クラスタ+ API クラスタ+分散 DB 構成
終焉
• C10K 問題(コネクション数の爆発)Apache ( 100 プロセス ×10 サーバ) ×API ( 100 プロセス ×10 サーバ)= 100万コネクション
とことん PHP
• かなり大規模なサイトの話• KVS や分散 DB の ORM など殆ど無い
39
分散 DB
インターネットインターネット
セッションDB
API API API
分散DB
分散DB
分散DB
分散DB
ボトルネック
40
C10K
41
C10K
インターネットインターネット
セッションDB
API API API
分散DB
分散DB
分散DB
分散DB
Gateway
WEB WEB WEB
42
C10K
• Gateway導入によってコネクション数を削減• GatewayはWebサーバ毎に設置しても十分効果的• API → 分散DBでも同様(MongoDBならばShardingで解決)
WEB クラスタ+ Gateway + API クラスタ+分散 DB 構成
とことん PHP
• ゲートウェイ実装NIO & Pipelining が理想
43
C10K
• Gateway導入によってコネクション数を削減• GatewayはWebサーバ毎に設置しても十分効果的• API → 分散DBでも同様(MongoDBならばShardingで解決)
WEB クラスタ+ Gateway + API クラスタ+分散 DB 構成
とことん PHP
• ゲートウェイ実装NIO & Pipelining が理想
終焉
• 運用が破綻する 各種 API サーバの管理は大変そう• システムのある限り、また新たな C10K がどこかに・・・
44
C10K
インターネットインターネット
セッションDB
API API API
分散DB
分散DB
分散DB
分散DB
Gateway
WEB WEB WEB
45
そしてクラウドへ
46
そしてクラウドへ(イメージ)
インターネットインターネット
WEBWEB
APIAPI
分散DB
分散DB
分散DB
分散DB
Controller
View
Model
47
そしてクラウドへ
• WEBクラウド、APIクラウド、の各ホストの事を考えたくない• WEBクラウド→APIクラウドの通信経路をどう解決するか?
WEB クラウド+ API クラウド+分散 DB 構成
PHP
• PHP でもクラウド出来るぜ!!てきな・・・
懸念
• 分散 DB はどうしよう?• 何処かの C10K
• ネットワークインフラの限界はあるのでそっちはそっちで頑張る
48
PHP クラウドへ
49
PHP クラウドへ
• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→APIクラウドの非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面
クラウド化への課題
50
PHP クラウドへ
• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→APIクラウドの非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面
クラウド化への課題
51
PHP クラウドへ
WEBクラウド→APIクラウドの通信経路をどう解決するか?• ZookeeperでAPIクラウドのノード管理を行う
WEB クラウド→ Zookeeper→API クラウド
Zookeeper
• プロセス監視と有効プロセス一覧の提供、通知ができる• プロセスが死亡した場合、自動的に一覧からも削除される• ネームサーバと同様の使い方が可能• 数千を超えるノード監視ができる• Zookeeper 自身もクラスタ構成
/API
|- API1
| |- node1
| |- node2
| -API2
|- node3
|- node4
52
PHP クラウドへ
インターネットインターネット
WEBWEB
APIAPI
分散DB
分散DB
分散DB
分散DB
Controller
View
Model
Zookeeper
53
PHP クラウドへ
• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面
クラウド化への課題
54
PHP クラウドへ
ØMQ で容易に実現できる。(バランシング込み)
WEBクラウド→並行リクエスト→ APIクラウド
ØMQ ( zoeromq )
• 非常に高速( length-value データ構造で高効率)• 特にデバイス( Gateway で利用)は C と同速度( extention内で完結)• N vs M 通信が簡潔に記述できる• 非同期通信(並行処理)が可能• リコネクト、リトライ、キューイングは勿論自動• 柔軟な通信配線が可能• 1メッセージがマルチパート
55
PHP クラウドへ
ØMQ ( zoeromq )
class GatewayDaemon { public function __construct($frontDSN,$backDSNs){ $this->frontDSN = $frontDSN; $this->backDSNs = $backDSNs; $this->zmqCtx = new \ZMQContext(); $this->zmqSockFront = new \ZMQSocket($this->zmqCtx, \ZMQ::SOCKET_XREP); $this->zmqSockBack = new \ZMQSocket($this->zmqCtx, \ZMQ::SOCKET_XREQ); }
public function main(){ $this->zmqSockFront->bind($this->frontDSN); foreach($this->backDSNs as $backDSN ) { $this->zmqSockBack->connect($backDSN); } new \ZMQDevice(\ZMQ::DEVICE_QUEUE,$this->zmqSockFront,$this->zmqSockBack); }}
56
PHP クラウドへ
インターネットインターネット
WEBWEB
APIAPI
分散DB
分散DB
分散DB
分散DB
Controller
View
Model
ZookeeperφMQ
φMQ φMQ
57
PHP クラウドへ
• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面
クラウド化への課題
58
PHP クラウドへ
ClearSilver
• View では余計な仕事はしたくない人向け• 高速でシンプルなレンダリングエンジン( C 言語)• if / else , for , function call 辺りまでなら十分
<?cs if: S.wiki.login.name ?>
<a href="/wiki/default/a/login">Logout</a>
<?cs else ?>
<a href="/wiki/default/a/signup">Sign up</a>
<?cs /if ?>
59
PHP クラウドへ
• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面
クラウド化への課題
60
PHP クラウドへ
MongoDB
• C++ で開発された高速 DB ( NoSQL )• 大量処理に特化• トランザクション不可• リレーション不可• Map/Reduce
• Sharding (パーテショニング)• ドキュメントベース• 1000 台規模を組む事ができ、勿論 C10K も対応( MongoOS )• Read が速い!=WEB向き
61
PHP クラウドへ
• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面
クラウド化への課題
62
PHP クラウドへ
Capistrano
• Ruby製のデプロイツール• Rails ではお馴染み• ターゲットサーバには SSH しか求めない(特別な準備が必要ない)• シェルベース処理ならなんでも来い
Capistrano サーバ
サーバ サーバ サーバ サーバ
オペレーション (on ssh)
63
そしてクラウドへ
• WEBクラウド→APIクラウドの通信経路をどう解決するか?• WEBクラウド→非同期並列リクエスト• ゲートウェイ(C10K対策)• レンダリング(テンプレートエンジン)はどうするか?• 分散DBの選定• 運用面
クラウド化への課題
64
Cockatoo (開発名 Albatross )
65
Cockatoo 概要
66
Cockatoo
特徴
• PHP製WEB フレームワーク• シングルポイントを排除
– どのサーバ(1台)が落ちても即時運用は発生しない
• 並行処理でリクエストを高速化• WEB→API の呼び出しは RPC インターフェスで隠蔽• レイアウト(ページの構成)情報を外部ストレージ化( MongoDB )• 開発効率重視
– CMS を搭載( WebUI )– 配置周り(表示位置など)の HTML/CSS は記述不要( CMS で吸収)– マウス操作のレイアウトエディタ( wysiwyg )– All in one 環境 Apache(php)+ClearSilver
• Ajax,plain-text, バイナリをサポート
67
Cockatoo-webDeviceSelector
Cockatoo-action Cockatoo-action
Cockatoo-gateway
アプリケーション & デバイス
Cockatoo には複数の独立したアプリケーションが同居できるアプリケーションには複数の デバイス(同一 URL でのコンテンツ出し分け)を設定できるこれらの振り分け処理は RequestParser,DeviceSelector で定義
RequestParser
Application ( wiki )
device (default)
device (android)
/news/wiki
/news
LayoutDB
SessionDB
zookeeperContentsDBApplication
( yslowview )
LayoutDB
SessionDB
ContentsDB
device (default)
68
Web ページ
ページは独立した複数処理に分割出来る
69
Page / Layout / Components
Page 1 : 1 Layout 1 : n Components
70
一般的な3層アーキテクチャ
InternetInternet
WEBWEB
APIAPI
DB
Request
Call APIs
Retrieve data
71
Cockatoo 概要
InternetInternet
WEBWEB
APIAPI
ContentsDB MongoDB ReplSet
RequestLayoutDB
MongoDB ReplSet Call APIs
Retrieve data
Get components
SessionDB
MongoDB ReplSet
Memcache
Gat page layout
72
Cockatoo 概要
InternetInternet
WEBWEB
APIAPI
ContentsDB MongoDB ReplSet
RequestLayoutDB
MongoDB ReplSet Call APIs
Retrieve data
Get components
SessionDB
MongoDB ReplSet
Memcache
Gat page layoutMongoDB は READ には強く WEB アクセスに十分耐える性能がある。
しかし WRITE それ程でも無いセッションなどは Memcached の方が無難
73
Cockatoo 概要
InternetInternet
WEBWEB
APIAPI
ContentsDB MongoDB ReplSet
RequestLayoutDB
MongoDB ReplSet Call APIs
Retrieve data
Get components
SessionDB
MongoDB ReplSet
Memcache
Gat page layout
Zookeeper
74
Cockatoo 概要
InternetInternet
WEBWEB
APIAPI
ContentsDB MongoDB ReplSet
RequestLayoutDB
MongoDB ReplSet Call APIs
Retrieve data
Get components
SessionDB
MongoDB ReplSet
Memcache
Gat page layout
Zookeeper Solr
75
CMS
Developer
Cockatoo 概要
API serversAPI servers
ContentsDB MongoDB ReplSet
Set page layoutHTML markup &API settings
LayoutDB
MongoDB ReplSet
Deploy API
Set components
Batch servers
Insert Data
Set static contents
76
CMS ー レイアウトエディタ
Layout editor
77
CMS - コンポーネントエディタ
78
CMS - ページエディタ
79
Cockatoo 構成例
80
LayoutDB(replset)
zookeeper cluster
API cloudAPI cloud
Zookeeper server
WEB cloudWEB cloud
Web server
apache
cockatoo-webφMQ
ClearSilver
php
cockatoo-gatewayφMQ
φMQ
API server
php
cockatoo-actionφMQ
Web server
apache
cockatoo-webφMQ
ClearSilver
php
cockatoo-gatewayφMQ
φMQ
API server
php
cockatoo-actionφMQ
Web server
apache
cockatoo-webφMQ
ClearSilver
php
cockatoo-gatewayφMQ
φMQ
API server
php
cockatoo-actionφMQ
Zookeeper serverZookeeper server
zookeeper
Mongo server
MongoDB
Mongo server
MongoDB
Mongo server
MongoDB
ContentsDB(replset)
Mongo server
MongoDB
Mongo server
MongoDB
Mongo server
MongoDB
SessionDB
Memcached server
Memcache
Memcached server
Memcache
Memcached server
Memcache
HTTP
page info
session data
API info
API call (RPC)
query
session data
regist
Load Balancer
business logics
Cockatoo クラスタ構成(サービス環境)
81
Local machine
LayoutDBapache
cockatoo-webClearSilver
cockatoo-action
Filesystem
ContentsDB
Filesystem
SessionDB
Filesystem
HTTP
page info
session data
API call (function call)
query session data
Blowser
business logics
Cockatoo スタンドアロン構成(開発環境)
API呼び出しの RPC 部分をショートカット( zmq,zookeeper 要らない)ストレージ処理も同様に簡素化( Mongo,memcached 要らない)
82
API cloudAPI cloud
WEB cloudWEB cloud
Web server
apache
cockatoo-webφMQ
ClearSilver
php
cockatoo-gatewayφMQ
φMQ
API server
php
cockatoo-actionφMQ
Web server
apache
cockatoo-webφMQ
ClearSilver
php
cockatoo-gatewayφMQ
φMQ
API server
php
cockatoo-actionφMQ
Web server
apache
cockatoo-webφMQ
ClearSilver
php
cockatoo-gatewayφMQ
φMQ
API server
php
cockatoo-actionφMQ
クラスタ構成
HTTP
page info
session data
API info
API call (RPC)
session data
Load Balancer Local machine
apache
cockatoo-webClearSilver
cockatoo-action
HTTP
page info
session data
API call (function call)
query session data
Blowser
開発環境
LayoutDB
Filesystem
SessionDB
ContentsDB
FilesystemFilesystem
zookeeper cluster
Zookeeper serverZookeeper server
Zookeeper server
zookeeper
ContentsDB(replset)
Mongo server
MongoDB
Mongo server
MongoDB
Mongo server
MongoDB
query regist
LayoutDB(replset)
Mongo server
MongoDB
Mongo server
MongoDB
Mongo server
MongoDB
SessionDB
Memcached server
Memcache
Memcached server
Memcache
Memcached server
Memcache
Tools
business logics
business logics
Capkg
Packaging
DeployExport
Import
83
Cockatoo シーケンス
84
Cockatoo シーケンス
シーケンス
並列 Action
事前 Action
事後 Action
リクエスト
レスポンス
レンダリング