2016年6月17日 星期五
Websocket的解決方案:Client Browser使用 Javascript,Server使用python或node.js
Websocket 是一種Internet上資料傳送與接收的一個新技術。只要能掌握這個技術,就可以實現許多需要透過網路傳送資料的應用程式。
Server: python(tornado), node.js(socket.io, ), ...
Client(Browser): javascript (socket.io)
是否可以將websocket Client連上 websocket server,而不論server是用哪一種語言實現的。其實理論上是必然可行的,因為websocket只是一個傳輸資料的protocol,因此python, node.js等等畢竟都只是開發的工具而已,只要傳送/接收的資料符合protocol,那資料理論上是可以傳輸無阻的。
這篇文章是一個學習記錄的過程,目的就是要實驗這個理論,並且更熟悉實務上會用到哪些函式庫,以及這此函式庫是否有什麼使用上的限制。網路上有非常多的資源說明怎麼架設websocket server/client,但是通常都是單一方法的說明。
環境說明:Server端架設在AWS EC2 上
1. 在server端使用python 搭配tornado library架設websocket server
2. 在client端建立websocket client
3. 在server端改使用node.js 架設websocket server
4. 在server, client端使用node.js中使用socket.io library
1. 在server端使用python 搭配tornado library架設websocket server
[source code]websocket server written in python using tornado module
2. 在client端建立websocket client
[source code]websocket client written in html/javascript
3. 在server端改使用node.js 架設websocket server
[source code]websocket server written in node.js
[source code]修改後的websocket client written in html/javascript
4. 在server, client端使用node.js中使用socket.io library
[source code]websocket server written in node.js with socket.io module
[source code]websocket client using socket.io module
references: [1]使用 Node.js 與 Socket.IO 建立即時性(Realtime)網頁應用程式 App
2016年5月26日 星期四
研究Amazon AWS Lambda: (三)Lambda function如何被喚醒
pull events v.s. push events
Lambda是用什麼機制去偵測特定的事件是否發生的呢?比如說Lambda要怎麼知道Amazon S3 bucket中的資料是否變動?
答案是AWS Lambda採用了pull(拉)與push(推)這兩個方式(event modle),可以分別類比成主動與被動的行為。
push(Lambda是被動的)
有的事件產生者會主動將event 的發生push給AWS Lambda知道並使lambda function被執行,在這個情形下,AWS Lambda是處於一個被動的狀態;
pull(Lambda是主動的)
而另一種模式則是事件產生者只發佈目前有event發生,但需要AWS Lambda主動去將該event pull回來並使lambda function執行,這就是這兩種event model的基本概念。
當AWS Lambda需要使用AWS 其他資源(比如S3 bucket, 或讀取DynamoDB table),Lambda必須獲得該有的授權。更多資訊參考AWS Lambda Permissions Model
Event source mapping
因為我們不只會有一個event 與 Lambda function,因此他們之間需要存在一個對應關係
for "pull" case
在AWS Lambda,用相關的AWS Lambda API產生相關的mapping
for "push"case
在事件的產生者端,由事件產生者提供的APIs來產生相關的mapping
More About Pull Event Model
當event sources 是AWS Kinesis, AWS DynamoDB Streams時使用。
如下圖,這個例子[1]是一個App將資料寫入Amazon Kinesis,而Lambda會去偵測是否有資料增減的事件產生,若有,則呼叫Lambda function執行,這個主動將溪件取回(pull)來處理的動作就像圖示中的"手"一樣。
More About Push Event Model
有些event sources可以主動將event 送(i.e. "Push")給AWS Lambda,換句話說,AWS Lambda是一個被動的角色。所以Lambda function是由event source所直接喚醒的。
有push功能的event souces有Amazon S3, Amazon SNS, Amazon Cognito, Amazon Echo等。
舉其中Amazon S3的例子而言,Amazon S3有提供一個API讓使用者可以設定當特定的事件發生時,要引發哪一個Lambda function。更多說明請參考Configuring Amazon S3 Event Notifications.
如下圖,這個例子的使用情境是使用者在Amazon S3 Bucket中產生一個物件,當Amazon S3 偵測到這個事件時引發指定的Lambda function(i.e. Amazon S3 "push" event and "invoke" AWS Lambda function)。
references:
[1]http://docs.aws.amazon.com/lambda/latest/dg/intro-invocation-modes.html
2016年5月24日 星期二
研究Amazon AWS Lambda: (二)新手資源的筆記
AWS Lambda官網建議新手先閱讀的資料,在這篇做些筆記。
References
[1] AWS Lambda webpage: Landing page of official AWS Lambda,基本概念
[2] AWS Lambda: How It Works.:工作原理
[3] programming-model:與實作語言(node.js, JAVA, python)相關的程式結構
References
[1] AWS Lambda webpage: Landing page of official AWS Lambda,基本概念
[2] AWS Lambda: How It Works.:工作原理
[3] programming-model:與實作語言(node.js, JAVA, python)相關的程式結構
Lambda的基本概念[1]
首先是lambda的操作流程- 使用者上傳程式碼到AWS Lambda
- 設定Lambda在什麼情況下被喚醒
- Lambda開始運作,使用者可以轉身去做其他事
- 使用者付費:Lambda被喚醒做事情的這段時間工資由使用者付擔
Lambda可以做什麼事?
- 資料處理
- 即時檔案處理:資料上傳後,立即被Lambda處理。比如建立圖片縮圖,影片轉碼、檔案編索、驗證內容、篩選資料。
可以參考The Seattle Times使用Lambda來調整影像的大小,以符合手機/電腦不同的螢幕大小 - 即時串流處理:可以用來追蹤應用程式活動,相關應用應與社群行為分析有關。這部份關聯到AWS KINESIS這個服務,目前還不熟悉,在這篇文章先跳過這個部份。
- 作為後端程式:處理web, 行動、物聯網及第三方api的request
- 行動後端
使用情境:當使用者在前端上傳一個近況,透過API通知Lambda,Lambda找到使用者的朋友清單,並發出SNS訊息給朋友們 - Web application
使用情境:AWS S3上架設了一個天氣查詢網站,當使用者按下查詢當地天氣的按鈕時,透過API通知Lambda,Lambda在database中取得當地天氣的資料並將該資料回傳給使用者。
Lambda的工作原理[2]
- lambda的核心:lambda function and event source
- lambda function 可以透過 HTTPS or AWS SDKs 喚醒
- lambda function由code, configuration information組成。configuration information包含了你想要用多少計算資源(記憶體的量),lambda 存取AWS 資料的權限。在configuration中,使用者也需要去設定一個handler function來處理event data
- Lambda使用的記憶體由programmer指定,而CPU方面,AWS Lambda會自動根據記憶體的大小去分配,基本上是等比例增加的,比如說使用256MB記憶體空間的Lambda function,比起使用128MB記憶體空間的Lambda function的CPU大小是兩倍。
- Event Sources: 在以下情況時,可以作為讓Lambda 執行的事件
- AWS services 選項非常的多,只能先選幾個介紹
Amazon S3 是Amazon提供的雲端空間服務,使用者可以上傳檔案到這個空間中,而S3內部資料的增減,也可以作為trigger Lambda 的事件
Amazon DynaoDB是AWS 的雲端資料庫服務,資料庫的更新也可以作為trigger event
其他還有Amazon Kinesis, Amazon SNS, Amazon SES, Amazon Cognito, Amazon CloudWatch Logs, AWS CloudFormation, Amazon CloudWatch Events, AWS Config - Scheduled Event
AWS除了是event-driven的方式被呼叫,他同時也可以作為一個有固定行程的服務,programmer可以設定Lambda function被固定執行的頻率(比如每天執行、每小時執行,或每週執行)。 - Other Amazon services (Amazon Echo)
這是一個很酷的功能,Amazon Echo是包含喇叭、mic的硬體,而Alexa是搭載在上面的語言助理軟體,Alexa有提供一個APIs,去呼叫Lambda進行客製的功能。 - On-Demand Lambda Function Invocation: Over HTTPS
使用Amazon API Gateway將GET, PUT這些request傳給Amazon API Gateway service,然後喚起Lambda function,參考Amazon API gateway - On-Demand Lambda Function Invocation: Build Your Own Event Sources
使用AWS SDKs or AWS Mobile SDKs 就可以產生Lambda 可以接收的事件
Programming Model[3]
Lambda function 包含這些核心:- Handler:當Lambda function被喚醒時,會馬上呼叫Handler。AWS Lambda將event data作為第一個參數給handler。
- The context object and how it interacts with Lambda at runtime :AWS Lambda傳送給handler的第二個參數是context object。簡單來說,context object是用來當Lambda function與AWS Lambda之間handshake的溝通介面
- Logs
- Exceptions
2016年5月23日 星期一
研究Amazon AWS Lambda: (一)Overview
前言
參加AWS Commit Taipei 2016 時第一次接觸到AWS Lambda 這個產品,直覺這個服務可以做的應用非常的多,但一切的一切有些模糊,於是想要花點時間來研究整理一下這個服務的操作流程、有哪些使用情境、跟其他服務有什麼差別,以及使用這個服務需要多少錢,有什麼限制等等這些資訊。此外想寫這個系列文章的主要動機也是發覺網路上沒有太多用中文寫的AWS Labmda介紹,於是也想要寫下並分享相關知識的記錄。AWS Lambda是什麼?
save your time:watch Introduction to AWS Lambda@youtube first
使用者可以在以下情況中使用AWS Lambda:
1. 把Lambda當作一個事件處理的幫手(event-driven compute service):比如說當存放在AWS S3 bucket的資料有變動時,Lambda就會自動被喚起去執行使用者囑附的工作。
2. 使用者透過Amazon API Gateway或API calls等方式發送命令(HTTP requests)給Lambda,讓Lambda去執行指定的動作
Lambda只有在需要的時候才會被執行(特定事件或使用者下指令),並且會根據流量auto-scale。使用者不太需要擔心需要實作適用小流量的版本(few requests per day),或大流量的版本(thousands per second)因為auto-scale也是Lambda提功服務的feature之一。
Lambda跟EC2的差別
比較明瞭的區分方式是在於使用者需要面對什麼。
EC2,使用者面對的是一台電腦,一台重灌好的電腦,但是什麼都沒有,所以今天如果使用者想要把這台電腦當成是網站的server,那使用者知道要怎麼安裝apache或是nginx等hosting service,或是當使用者想要在這個電腦上學習怎麼用linux環境寫C的程式,那使用者就要先確認好compiler的指令、參數等。換句話說,如果使用EC2,使用者除了自己要用程式實現的功能外,也需要熟悉怎麼去架設正確的環境。另一個角度去思考這件事情呢,就是使用EC2,使用者保有很大的空間去調校系統,比如環境的語言啦,網路設定啦,儲存運算要用多少資源等等比較系統層面的設定。
Lambda,使用者面對的是怎麼用指定的語言去做自己想要的功能,並且需要閱讀相關的開發指南,去把指定的程式(lambda function, and node.js/JAVA/python file)在AWS console中設定以及上傳。所以說使用Lambda的話,在環境架設方面需要花費的心力就省去很多。總的來說,因為Lambda的使用環境是限制的,所以只要是環境限制的範圍內(在develope guide中可以找到的功能),使用者都可以專心在怎麼實作出想要的功能,而系統層面的問題,Lambda會處理掉
"AWS Lambda manages the compute fleet that offers a balance of memory, CPU, network, and other resources. "[1]
題外話,筆者很喜歡AWS Commit 中聽到的一句話,是關於Amazon的企業文化:只要一件事情被重複做了兩次,那這件事情就需要/可以被自動化。也許Lambda會被推出,也是工程師因為不停的調校系統環境搞得煩死了,索性設計出一個服務來自動調校系統環境而衍生出來的服務呢!
相關應用
以下是筆者想到使用AWS Lambda的服務(草稿中)
(1) 固定每天去擷取open-data並產出當天版本的api,相關技術可以參考将 AWS Lambda 用于计划的事件。
(2) 前端每五秒拍下一張影像並上傳到AWS S3,而Lambda在AWS S3資料有新增的時候被啟動,運行讀取影像,影像辨視人臉,並將人臉存入資料庫的動作,再把資料庫的更新顯示在前端的介面上(AWS Commit 現場DEMO Case)
References:
訂閱:
文章 (Atom)