摘要:本文以使用阿里云函數計算為例,構建一個簡單具體的為例,看看這種架構是如何達到快速開發和節約運維成本的。方案在本文中,我們運用阿里云函數計算表格存儲,就能快速搭建這個服務,會自動去應對請求流量,同樣函數計算也會根據流量自動。
摘要: Serverless 是一種架構理念,具有自己的獨特的優勢和適用場景。本文以使用阿里云函數計算為例,構建一個簡單具體的microservice為例,看看這種架構是如何達到快速開發和節約運維成本的。
點此查看原文:http://click.aliyun.com/m/41322/
Serverless 是一種架構理念,具有自己的獨特的優勢和適用場景。本文以使用阿里云函數計算為例,構建一個簡單具體的microservice為例,看看這種架構是如何達到快速開發和節約運維成本的。
應用場景1
某游戲公司剛開發完一個新的游戲,想要進行一些封閉測試,他們需要一個管理激活碼的service來邀請有激活碼的玩家來參與封閉測試,同時可能對積極參與封閉測試的玩家,等正式開服后,給予一定的禮包券碼
應用場景2
某垂直領域的電商,剛剛起步,流量不是特別大,但發展勢頭不錯。他們需要一個管理優惠碼的service
針對上面所說的兩個場景,無論是優惠碼,激活碼等相關碼的管理,一般有如下四個:
生成碼
使用碼
驗證碼
刪除碼
傳統方案
用戶自己去架設服務器,配置數據庫,再編寫對應的服務,再配備相應的運維人員,總之,不管是硬件成本還是人力成本都不少。
serverless 方案
在本文中,我們運用阿里云API Gateway + 函數計算 + 表格存儲(OTS),就能快速搭建這個服務,API Gateway 會自動 scale 去應對請求流量,同樣函數計算也會根據流量自動 scale。開發方面,只需要實現好對應的邏輯函數即可。運維方面,省去了管理密匙、打安全補丁等工作,因為用戶根本沒有需要維護的機器。整個解決方案如下圖:
從上圖我們可以看出,主要有兩個步驟:
函數計算作為 API 網關后端服務, 具體的教程可以參考官方教程和函數計算獲取臨時token
函數計算結合ots實現具體的邏輯,本文主要講解這個過程, 并給出具體的代碼。
具體步驟
1, 創建一個ots實例,并在實例中創建一張表;在本例中,是在華東2 region創建了code-ots實例,并在該實例中創建了一張表code, 主鍵是STRING類型
2, 創建對應的service,service下面創建4個函數,分別為gen_code, del_code, query_code, use_code, 具體的代碼可以在本文最后附件下載,由于函數要訪問ots,這邊需要配置service可以讀寫ots的權限,相關授權教程可以參考函數計算實現流式處理大文件中的具體步驟第2步, 本文最后配置如下圖,從下圖可知,我們創建的service的服務角色是fc-ots-rw,該角色擁有對ots讀寫的權限。
具體function
1 生成碼
配置event
{ "num":1000, "start period":"2017-12-22 00:00:00", "end period":"2017-12-28 00:00:00", }
通過這個配置的event,設置的目標是產生1000個碼, 碼的有效期在2017-12-22 00:00:00 至 2017-12-28 00:00:00,默認產生的狀態都是UNACTIVED,未激活的
code
# -*- coding: utf-8 -*- import uuid import json import time from tablestore import * from tablestore.retry import WriteRetryPolicy table_name = "code" # 具體的table ots_name = "code-ots" # ots 實例 BATCH_NUM = 200 def batch_write_row(client, start, end, num): put_row_items = [] for i in range(0, num): uid_str = str(uuid.uuid1()) primary_key = [("uuid", uid_str)] attribute_columns = [("start", start), ("end", end), ("status", "UNACTIVED")] row = Row(primary_key, attribute_columns) condition = Condition(RowExistenceExpectation.EXPECT_NOT_EXIST) item = PutRowItem(row, condition) put_row_items.append(item) request = BatchWriteRowRequest() request.add(TableInBatchWriteRowItem(table_name, put_row_items)) result = client.batch_write_row(request) succ, fail = result.get_put() print ("check input table"s put results: is_all_succeed={0}; succ_num={1}; fail_um={2}".format(result.is_all_succeed(), len(succ), len(fail))) for item in fail: print ("Put failed, error code: %s, error message: %s" % (item.error_code, item.error_message)) def upload_ots(context, num, start, end): endpoint = "https://{}.cn-shanghai.ots-internal.aliyuncs.com".format(ots_name) creds = context.credentials client = OTSClient(endpoint, creds.accessKeyId, creds.accessKeySecret, ots_name, sts_token = creds.securityToken, retry_policy = WriteRetryPolicy()) while num > 0: w_num = num if num > BATCH_NUM: w_num = BATCH_NUM batch_write_row(client, start, end, w_num) num = num - w_num def handler(event, context): evt = json.loads(event) num = int(evt["num"]) start = evt["start period"] end = evt["end period"] start_t = time.mktime(time.strptime(start, "%Y-%m-%d %H:%M:%S")) end_t = time.mktime(time.strptime(end, "%Y-%m-%d %H:%M:%S")) print uuid.uuid1(), type(uuid.uuid1()) upload_ots(context, num, start_t, end_t) return "ok"
2 使用碼
配置event
{ "uuid":"254804e8-e707-11e7-9c21-0242ac110004" }
假設使用碼254804e8-e707-11e7-9c21-0242ac110004,只有表中存在這個碼并且這個碼是UNACTIVED才返回SUCCESS,并且把該碼的狀態設置為ACTIVED。其他情況,比如不存在這個碼,或者是存在這個碼但是已經被激活使用過,都返回FAIL
code
# -*- coding: utf-8 -*- from tablestore import * from tablestore.retry import WriteRetryPolicy import json table_name = "code" ots_name = "code-ots" def update_row(client, uuid): primary_key = [("uuid",uuid)] update_of_attribute_columns = { "PUT" : [("status","ACTIVED")], } row = Row(primary_key, update_of_attribute_columns) condition = Condition(RowExistenceExpectation.EXPECT_EXIST, SingleColumnCondition("status", "UNACTIVED", ComparatorType.EQUAL)) try: consumed, return_row = client.update_row(table_name, row, condition) print ("Update succeed, consume %s write cu." % consumed.write) except Exception as e: return "FAILED" return "SUCCEED" def handler(event, context): endpoint = "https://{}.cn-shanghai.ots-internal.aliyuncs.com".format(ots_name) creds = context.credentials client = OTSClient(endpoint, creds.accessKeyId, creds.accessKeySecret, ots_name, sts_token = creds.securityToken, retry_policy = WriteRetryPolicy()) evt = json.loads(event) uuid = str(evt["uuid"]) return update_row(client, uuid)
3 查詢碼
配置event
{ "uuid":"254804e8-e707-11e7-9c21-0242ac110004" }
假設查詢碼254804e8-e707-11e7-9c21-0242ac110004,只有表中不存在這個碼返回NO EXISTED, 存在的話,則返回表中記錄的狀態
code
# -*- coding: utf-8 -*- from tablestore import * from tablestore.retry import WriteRetryPolicy import time,json table_name = "code" ots_name = "code-ots" def get_row(client, uuid): primary_key = [("uuid", uuid)] columns_to_get = [] cond = CompositeColumnCondition(LogicalOperator.OR) cond.add_sub_condition(SingleColumnCondition("status", "UNACTIVED", ComparatorType.NOT_EQUAL)) cond.add_sub_condition(SingleColumnCondition("status", "UNACTIVED", ComparatorType.EQUAL)) consumed, return_row, next_token = client.get_row(table_name, primary_key, columns_to_get, cond, 1) print ("Read succeed, consume %s read cu." % consumed.read) if return_row is None: return "NO EXISTED" status = "UNKNOWN" for att in return_row.attribute_columns: print ("name:%s value:%s timestamp:%d" % (att[0], att[1], att[2])) if att[0] == "status": status = att[1] if att[0] == "start": start = att[1] if att[0] == "end": end = att[1] current_time = time.time() if current_time > end or current_time < start: status = "TIMEINVALID" return status def handler(event, context): endpoint = "https://{}.cn-shanghai.ots-internal.aliyuncs.com".format(ots_name) creds = context.credentials client = OTSClient(endpoint, creds.accessKeyId, creds.accessKeySecret, ots_name, sts_token = creds.securityToken, retry_policy = WriteRetryPolicy()) evt = json.loads(event) uuid = str(evt["uuid"]) return get_row(client, uuid)
4 刪除碼
配置event
{ "uuid":"254804e8-e707-11e7-9c21-0242ac110004" }
假設刪除碼254804e8-e707-11e7-9c21-0242ac110004,不管表中是否存在這個碼,只要表中沒有這個碼了就是成功刪除,除非ots sdk delete_row拋出異常
code
# -*- coding: utf-8 -*- from tablestore import * from tablestore.retry import WriteRetryPolicy import json table_name = "code" ots_name = "code-ots" def delete_row(client, uuid): primary_key = [("uuid",uuid)] row = Row(primary_key) condition = Condition(RowExistenceExpectation.IGNORE, SingleColumnCondition("status", "", ComparatorType.NOT_EQUAL)) try: consumed, return_row = client.delete_row(table_name, row, condition) print ("Delete succeed, consume %s write cu." % consumed.write) except: return "FAILED" return "SUCCEED" def handler(event, context): endpoint = "https://{}.cn-shanghai.ots-internal.aliyuncs.com".format(ots_name) creds = context.credentials client = OTSClient(endpoint, creds.accessKeyId, creds.accessKeySecret, ots_name, sts_token = creds.securityToken, retry_policy = WriteRetryPolicy()) evt = json.loads(event) uuid = str(evt["uuid"]) return delete_row(client, uuid)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/8808.html
摘要:本文以使用阿里云函數計算為例,構建一個簡單具體的為例,看看這種架構是如何達到快速開發和節約運維成本的。方案在本文中,我們運用阿里云函數計算表格存儲,就能快速搭建這個服務,會自動去應對請求流量,同樣函數計算也會根據流量自動。 摘要: Serverless 是一種架構理念,具有自己的獨特的優勢和適用場景。本文以使用阿里云函數計算為例,構建一個簡單具體的microservice為例,看看這種...
摘要:往年回顧氪研究院長期追蹤一級市場行業動態,深入調研各領域細分賽道最具代表性的企業,從行業發展環境成長性競爭格局未來趨勢等角度進行分析與研究,輸出了包含人工智能金融教育醫療交通文娛電商泛科技在內的上百份報告。 showImg(http://upload-images.jianshu.io/upload_images/13825820-d8888a77e920c16f.jpg?imageM...
摘要:如果使用阿里云函數計算,您將高峰期每小時的訪問日志,或者低谷期每小時的訪問日志交給一個計算函數處理,并將處理結果存到中。下面結合阿里云的函數計算產品來講解各個應用場景中架構以及如何解決的場景中的痛點。 摘要: Serverless概念是近年來特別火的一個技術概念,基于這種架構能構建出很多應用場景,適合各行各業,只要對輕計算、高彈性、無狀態等場景有訴求的用戶都可以通過本文來普及一些基礎概...
閱讀 1662·2019-08-30 12:51
閱讀 656·2019-08-29 17:30
閱讀 3696·2019-08-29 15:17
閱讀 852·2019-08-28 18:10
閱讀 1355·2019-08-26 17:08
閱讀 2169·2019-08-26 12:16
閱讀 3429·2019-08-26 11:47
閱讀 3497·2019-08-23 16:18