Leon's Blogging

Coding blogging for hackers.

Http Websocket Bot

| Comments

簡單的 Http Websocket Bot 介紹

  • HTTP is hypertext transfer protocol
  • HTTP is an application protocol
  • HTTP is the foundation of data communication for the World Wide Web.

HTTP 是一個無狀態(Stateless)的協議,對於事務處理沒有記憶能力,伺服器不知道客戶端是什麼狀態。發送 HTTP 請求之後,伺服器根據請求,會給我們發送數據過來,但是,發送完,不會記錄任何訊息。

  • Http 1.0
    • HTTP 的生命週期透過 Request 來界定,也就是一個Request 一個Response,那麼在HTTP1.0中,這次HTTP請求就結束了
  • Http 1.1
    • 多出一個keep-alive,在一個HTTP連接中,可以發送多個Request,接收多個Response。
    • 但是 Request = Response , 在HTTP中永遠是這樣,也就是說一個request只能有一個response。而且這個response也是被動的,不能主動發起。

如何理解HTTP協議的「無連接,無狀態」特點?

傳統即時性網頁技術

  • Polling 輪詢
    • 瀏覽器每隔一段時間就自動送出一個 HTTP 請求給 server ,獲取最新的網頁資料
    • 在 server 沒有新資料時,瀏覽器也是會自動送出請求,造成網路資源浪費
  • Long-Polling 長時間輪詢
    • server 在接收到瀏覽器所送出的 HTTP 請求後, server 會等待一段時間,若在這段時間裡 server 有新的資料,它就會把最新的資料傳回給瀏覽器
    • 如果等待的時間到了之後也沒有新資料的話,就會送一個回應給瀏覽器,告知瀏覽器資料沒有更新
    • 如果在資料更新很頻繁的狀況下,長時間輪詢並不會比傳統的輪詢有效率,而且有時候資料量很大時,會造成連續的 polls 不斷產生,反而會更糟糕。
  • Streaming
    • 讓 server 在接收到瀏覽器所送出 HTTP 請求後,立即產生一個回應瀏覽器的連線,並且讓這個連線持續一段時間不要中斷,而 server 在這段時間內如果有新的資料,就可以透過這個連線將資料馬上傳送給瀏覽器。
    • 由於是建立在 HTTP 協定上的一種傳輸機制,所以有可能會因為代理 server(proxy)或防火牆(firewall)將其中的資料存放在緩衝區中,造成資料回應上的延遲,因此許多使用串流的 Comet 實作會在偵測到有代理 server 的狀況時,改用 Long-Polling 的方式處理。

WebSocket

WebSocket protocol 定義在 HTML5 標準中的一個新的網頁傳輸協議。

  • 是一種建立在單一 TCP 連線上的全雙工(full-duplex)通訊管道,可以讓網頁應用程式與伺服器之間做即時性、雙向的資料傳遞。
  • 瀏覽器與伺服器之間若要建立一條 WebSocket 連線,在一開始的交握(handshake)階段中,要先從 HTTP 協定升級為 WebSocket 協定

EventMachine

EventMachine 是一套事件驅動(event-driven IO) 的框架,基於Reactor Pattern 達到輕量化的併發處理

  • Reactor模式
    • 一個處理服務請求的並發程式設計模型。多個服務請求同時發往一個服務句柄(Service Handler)。服務句柄(Service Handler)多路分用到來的請求並把它們同步轉發給相關的請求處理器。

Github:

官網:

參考文件:

Video

Hubot

other

deploy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# create new heroku project
heroku create

# push heroku
git push heroku master

# env config setting
heroku config:add SLACK_API_TOKEN=xxxxxx-xxxxxxxxx-xxxxxxxxxxx

heroku config:add SLACK_API_TOKEN=xxoxb-74720840001-leOhdqKE1mX4hYknfHAeV049

heroku config:remove SLACK_API_TOKEN

# log
heroku logs --tail

# scale
heroku ps:scale web=2

實做簡易 slack bot

Comments