SlideShare a Scribd company logo
Elixirを利用した繊細なWebチャットの開発
@ndruger
Tokyo.exでは以前「軽量プロセスとシューティングで戦う」
(https://www.slideshare.net/ndruger/elixirstg)という、
少しネタっぽい発表しましたが、
今回はElixirでの「安定したシステム運用」に関する正統派な話
Elixirでの安定したシステム構築をするため、
有名な本「Erlang in Anger」を読んだ。
「Erlang In Anger」の目次
● I Writing Applications
○ 1 How to Dive into a Code Base
○ 2 Building Open Source Erlang Software
○ 3 Planning for Overload
● II Diagnosing Applications
○ 4 Connecting to Remote Nodes
○ 5 Runtime Metrics
○ 6 Reading Crash Dumps
○ 7 Memory Leaks
○ 8 CPU and Scheduler Hogs
○ 9 Tracing
素晴らしい情報源であり、内容の理屈はわかる。
ただ、Elixirでのシステム構築・障害の経験が少ない私には、
実感が湧きにくい部分もある。
「してはいけない」と書いてあるような、
Elixir/Erlangのアンチパターンを実際やってしまうと、
どういうことが起きるんだろう?
気になりませんか?
Elixirのアンチパターンによる
システム問題を体験できるWebアプリ
「Delicate Chat」の開発。
https://github.com/ndruger/delicate_chat
Delicate Chatとは?
● Phoenixを使ったシンプルなWebチャット
● 特徴
○ サーバサイドのElixirでの実装が「Erlang In Anger」での「してはいけ
ないこと(アンチパターン)」を活用して実装されている。
○ そのアンチパターンが原因のシステム障害を体験できる。
こんな感じのUI(デモる)
Erlang VM
の情報
投稿されたメッセージ
入力欄 障害生成
ボタン
● 「Erlang In Anger」から引用
○ > Don’t use dynamic atoms!
○ > If you use the xmerl library that ships with Erlang, consider open
source alternatives or figuring the way to add your own SAX parser that
can be safe .
つまり、アンチパターン的には、xmerlを使ってそれにユーザーの入力などを渡してやれ
ばいいのか。
チャットにxmlを送信すると、サーバサイドでxmerlでxmlバリデーション
(:xmerl_scan.string/1で実現(!?))した結果を付加してくれる機能を追加しよう。
アンチパターン1
(ユーザー入力をAtom生成系ライブラリに渡す)
体験デモ1
アンチパターン2
(過負荷を考えないメッセージ管理)
● 「Erlang In Anger」から引用
○ > Chapter 3. Planning for Overload
○ > 3.2 Restricting Input
過負荷を考慮して実装するためのパターンが書いてある。つまり、アンチパターン的に
は、過負荷を考えずにメッセージを投げればいいのか。
チャットに「メッセージの暴力性の判定&暴力的ユーザーへの通知」機能を追加する。1
つのGenServerのプロセスで非同期(GenServer.cast/2)で処理を受けつけて仮想的な
重い実装(Process.sleep(5_000))で処理して、定常的に過負荷を与えてみよう。
体験デモ2
1. 問題の起きるユースケースの理解が深まる。
2. 何が起きてどのような状態になるのかがわかり、ErlangVMの
どの項目を監視しておけば早めに検出できるのかがわかる。
アンチパターンが起こす問題を体験するメリット
たまにはElixir/Erlangを使って、
不安定なWebアプリを作ってみませんか?

More Related Content

PPTX
ネットワークプログラマビリティ勉強会 これまでのおさらい
PPTX
Gotanda Bachelor Thesis
PDF
ニコニコを支える Erlang / Elixir
PPTX
Elixir-Conf-Japan-2017-session-ohr486
PDF
パーフェクト"Elixir情報収集"
PPTX
Erlang and Elixir
PPTX
地獄のElixir(目黒スタートアップ勉強会)
PPTX
running-elixir-in-production
ネットワークプログラマビリティ勉強会 これまでのおさらい
Gotanda Bachelor Thesis
ニコニコを支える Erlang / Elixir
Elixir-Conf-Japan-2017-session-ohr486
パーフェクト"Elixir情報収集"
Erlang and Elixir
地獄のElixir(目黒スタートアップ勉強会)
running-elixir-in-production

Similar to Elixirを利用した繊細なwebチャットの開発 (20)

PPTX
2023-10-10_ElixirConf US 2023に参加してきました(レポート)
PPTX
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
PPTX
Tokyoex#5 Questions
PPTX
Elixir言語紹介
PPTX
やや関数型を意識した風Elixir/Phoenixご紹介
PPTX
Elixirと他言語の比較的紹介 ver.2
PPTX
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
PPTX
elixir in production
PDF
Nerves!? Elixir!?? 関数型言語でれっつIoT開発!!
PPTX
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
PPTX
ElixirでIoT!?ナウでヤングでcoolなNervesフレームワーク
PDF
160911 handson elixir_phoenix
PPTX
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
PDF
Build Dockferile with Haskell
PPTX
Elixirについて私が知ってる二、三の事柄
PDF
Erlangやってみた
PPTX
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
PDF
Lisp tutorial for Pythonista : Day 1
PPTX
Rubyのenum系高階関数を elixirでも使いたい
2023-10-10_ElixirConf US 2023に参加してきました(レポート)
Shibuya.ex #1 Elixirを本番環境で使ってみたという事例紹介
Tokyoex#5 Questions
Elixir言語紹介
やや関数型を意識した風Elixir/Phoenixご紹介
Elixirと他言語の比較的紹介 ver.2
ElixirをIoTボードで動かしてみた ~ラズパイ・big.LITTLE・Zynq編~
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」【旧版】※新版あります
elixir in production
Nerves!? Elixir!?? 関数型言語でれっつIoT開発!!
Elixir入門「第1回:パターンマッチ&パイプでJSONパースアプリをサクっと書いてみる」
ElixirでIoT!?ナウでヤングでcoolなNervesフレームワーク
160911 handson elixir_phoenix
Elixir入門「第2回:PC間で通信するアプリをサクっと書いてみる」
Build Dockferile with Haskell
Elixirについて私が知ってる二、三の事柄
Erlangやってみた
Elixir入門「第6回:Elixirはtry…catchを書かない~障害対応のパラダイムシフト~」
Lisp tutorial for Pythonista : Day 1
Rubyのenum系高階関数を elixirでも使いたい
Ad

Elixirを利用した繊細なwebチャットの開発