GoとServer-Sent Events
by
shuntaka
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
GoとServer-Sent Events shuntaka 2022/04/12 Let's Go Talk #9 (GoのLT会)
Slide 2
Slide 2 text
自己紹介 宜しくお願いします😌 埼玉からお送りしています! GitHub: https://github.com/shuntaka9576 blog: https://shuntaka.dev 仕事: AWS,IoT,サーバサイド,TypeScript,Pythonなど Go歴: 仕事ではほぼなく、ときどき趣味で書きます、、
Slide 3
Slide 3 text
目次 ・そもそもServer-Sent Events ・Server-Sent Eventsを調査した経緯 ・Goで実装する ・作ったツールの紹介
Slide 4
Slide 4 text
そもそも Server-Sent Events
Slide 5
Slide 5 text
Server-Sent Events(出典,詳細: MDN) リアルタイム通信をWebアプリケーションに実装するための技術 ・HTTP/1.1とHTTP/2に対応 ・単方向通信 WebSocketは双方向で、専用プロトコル
Slide 6
Slide 6 text
No content
Slide 7
Slide 7 text
No content
Slide 8
Slide 8 text
フィールドは複数ある(出典,詳細: MDN) ・event … イベントの種別 ・data … メッセージ内容(今回はdataだけ知っていればOK) ・id … EventSourceに設定するイベント ID ・retry … 指定時間待機後再接続要求
Slide 9
Slide 9 text
Server-Sent Eventsを調査した 経緯
Slide 10
Slide 10 text
OpenAI API ・OpenAIのAPIのサービス ・ChatGPTのWeb版(chat.openai.com)の機能がAPIとして提供 されている
Slide 11
Slide 11 text
ChatGPTの課金体系 ・ChatGPTのサブスクとAPIは課金体系が**別** ・ChatGPT Plusはサブスク$20 ・OpenAI APIは従量課金 ※ Open AI APIのGPT-4は、waitlistに登録しないと使えない。
Slide 12
Slide 12 text
仮説 使い方次第ではサブスクよりAPIを使った方が安くなるケースがあ りそう。
Slide 13
Slide 13 text
CLIを作ろう Gopher CLI作りがち問題...
Slide 14
Slide 14 text
CLI設計 ・Web版のような徐々に出力される体験にしたい 🤔
Slide 15
Slide 15 text
参考
Slide 16
Slide 16 text
Goで実装する
Slide 17
Slide 17 text
実装方法 1. github.com/sashabaranov/go-openai 2. github.com/r3labs/sse 3. 自前
Slide 18
Slide 18 text
3を選択 1. github.com/sashabaranov/go-openai => 多分一番穏便(ライブラリ内でSSEは自前実装) 2. github.com/r3labs/sse => GET以外のメソッドで未対応。パッチ当てればOK 3. 自前 => 2.を参考にしつつ実装した
Slide 19
Slide 19 text
No content
Slide 20
Slide 20 text
No content
Slide 21
Slide 21 text
GitHubコード Response.Bodyをリアルタイム逐次読み出し
Slide 22
Slide 22 text
No content
Slide 23
Slide 23 text
*bufio.Scanner *Response.Body (io.Reader) ストリーム読み 取りgoroutine ① ReadEvent ② Response GitHubコード 改行\n\nで逐次読み出し scanner.Split(splitFunc) メインgoroutine channel ② Response ③ ④ 標準出力 Server-Sent Event
Slide 24
Slide 24 text
No content
Slide 25
Slide 25 text
作ったツールの紹介 github.com/shuntaka9576/oax
Slide 26
Slide 26 text
詳細はZennのブログ記事へ
Slide 27
Slide 27 text
oax(OpenAI eXecuter) 動作 その1 所要2分くらいあれば実演
Slide 28
Slide 28 text
oax(OpenAI eXecuter) 動作 その1
Slide 29
Slide 29 text
oax(OpenAI eXecuter) 動作 その2
Slide 30
Slide 30 text
使ってよかったライブラリ github.com/alecthomas/kong github.com/itchyny/timefmt-go github.com/ktr0731/go-fuzzyfinder(2つ目Gifは99.9%こちらのラ イブラリのおかげ)
Slide 31
Slide 31 text
まとめ SSEのリアルタイムイベントハンドリングは、Goの得意分野 ・net/httpの豊富な機能 ・io.Readerのリアルタイムストリームを読み出し ・goroutineやchannelを使った並行処理
Slide 32
Slide 32 text
ご静聴ありがとうございました。