前回に続き、今回はPhoenixアプリを使ってPG2でのPubSubを試します。
アプリを用意
自分で用意するのも面倒なので、公式のexampleを使います。
git clone https://github.com/chrismccord/phoenix_chat_example
cd phoenix_chat_example
mix deps.get
npm install
今回は、vagrant上で実行しているので、check_originの設定をfalseにします。
config :chat, Chat.Endpoint,
url: [host: "localhost"],
root: Path.expand("..", __DIR__),
secret_key_base: "/RjKJmMO6raXPRTq63qTqid1x6lVKTOP+FTxZHfX6Ogd+1xYmH6eZZFhBu1CIwtg",
debug_errors: false,
pubsub: [name: Chat.PubSub,
adapter: Phoenix.PubSub.PG2],
check_origin: false # ここを追加
phoenixを起動します。
mix phoenix.server
起動するとこんな感じでチャットが出来るようになっています。
PubSubを試す
別ターミナルでアプリをコピーしてポート違いでPhoenixを起動します。
vagrant-ubuntu-precise-32% mix phoenix.server
[info] Running Chat.Endpoint with Cowboy using http on port 4000
vagrant-ubuntu-precise-32% mix phoenix.server
[info] Running Chat.Endpoint with Cowboy using http on port 4001
この状態では、ただ2つのアプリを立ち上げただけなのでチャットの状態は共有されていません。
その1と同様にsys.config
を設定します。
その状態で以下をそれぞれ実行
iex --name foo@127.0.0.1 --erl "-config sys.config" -S mix phoenix.server
iex --name bar@127.0.0.1 --erl "-config sys.config" -S mix phoenix.server
ちょっとわかりにくいですが・・・、
port違いのアプリケーションで a のメッセージが共有されています。
これで、PG2でPubSubが出来ました。
PG2でPubSubってどうなの?
web server1台で200万コネクションまでいけてるっぽいです。
更にスケールも、今回試したようにserverを増やせばPG2の性能的にある程度まではスケールするでしょう。
PG2の性能ですが、以下で調べている方がいました。
分散Erlang周りの性能測定メモ
Nodeが増えるごとに性能に劣化が見られるので、
許容できるレベルの劣化を超えるようであれば別にPubSubを用意したほうがいいでしょう。
RedisのPubSubがどのくらいスケールするのか正直わかっていませんが、
Redisをスケールさせるのはかなり難しいので、別の方法を考えたほうがいいと思ってます。
以上です。
PG2のPubSubの仕組み解説をその3でやるかもしれません。