摘要:本文以使用阿里云函數(shù)計(jì)算為例,構(gòu)建一個(gè)簡單具體的為例,看看這種架構(gòu)是如何達(dá)到快速開發(fā)和節(jié)約運(yùn)維成本的。方案在本文中,我們運(yùn)用阿里云函數(shù)計(jì)算表格存儲(chǔ),就能快速搭建這個(gè)服務(wù),會(huì)自動(dòng)去應(yīng)對(duì)請(qǐng)求流量,同樣函數(shù)計(jì)算也會(huì)根據(jù)流量自動(dòng)。
摘要: Serverless 是一種架構(gòu)理念,具有自己的獨(dú)特的優(yōu)勢和適用場景。本文以使用阿里云函數(shù)計(jì)算為例,構(gòu)建一個(gè)簡單具體的microservice為例,看看這種架構(gòu)是如何達(dá)到快速開發(fā)和節(jié)約運(yùn)維成本的。
點(diǎn)此查看原文:http://click.aliyun.com/m/41322/
Serverless 是一種架構(gòu)理念,具有自己的獨(dú)特的優(yōu)勢和適用場景。本文以使用阿里云函數(shù)計(jì)算為例,構(gòu)建一個(gè)簡單具體的microservice為例,看看這種架構(gòu)是如何達(dá)到快速開發(fā)和節(jié)約運(yùn)維成本的。
應(yīng)用場景1
某游戲公司剛開發(fā)完一個(gè)新的游戲,想要進(jìn)行一些封閉測試,他們需要一個(gè)管理激活碼的service來邀請(qǐng)有激活碼的玩家來參與封閉測試,同時(shí)可能對(duì)積極參與封閉測試的玩家,等正式開服后,給予一定的禮包券碼
應(yīng)用場景2
某垂直領(lǐng)域的電商,剛剛起步,流量不是特別大,但發(fā)展勢頭不錯(cuò)。他們需要一個(gè)管理優(yōu)惠碼的service
針對(duì)上面所說的兩個(gè)場景,無論是優(yōu)惠碼,激活碼等相關(guān)碼的管理,一般有如下四個(gè):
生成碼
使用碼
驗(yàn)證碼
刪除碼
傳統(tǒng)方案
用戶自己去架設(shè)服務(wù)器,配置數(shù)據(jù)庫,再編寫對(duì)應(yīng)的服務(wù),再配備相應(yīng)的運(yùn)維人員,總之,不管是硬件成本還是人力成本都不少。
serverless 方案
在本文中,我們運(yùn)用阿里云API Gateway + 函數(shù)計(jì)算 + 表格存儲(chǔ)(OTS),就能快速搭建這個(gè)服務(wù),API Gateway 會(huì)自動(dòng) scale 去應(yīng)對(duì)請(qǐng)求流量,同樣函數(shù)計(jì)算也會(huì)根據(jù)流量自動(dòng) scale。開發(fā)方面,只需要實(shí)現(xiàn)好對(duì)應(yīng)的邏輯函數(shù)即可。運(yùn)維方面,省去了管理密匙、打安全補(bǔ)丁等工作,因?yàn)橛脩舾緵]有需要維護(hù)的機(jī)器。整個(gè)解決方案如下圖:
從上圖我們可以看出,主要有兩個(gè)步驟:
函數(shù)計(jì)算作為 API 網(wǎng)關(guān)后端服務(wù), 具體的教程可以參考官方教程和函數(shù)計(jì)算獲取臨時(shí)token
函數(shù)計(jì)算結(jié)合ots實(shí)現(xiàn)具體的邏輯,本文主要講解這個(gè)過程, 并給出具體的代碼。
具體步驟
1, 創(chuàng)建一個(gè)ots實(shí)例,并在實(shí)例中創(chuàng)建一張表;在本例中,是在華東2 region創(chuàng)建了code-ots實(shí)例,并在該實(shí)例中創(chuàng)建了一張表code, 主鍵是STRING類型
2, 創(chuàng)建對(duì)應(yīng)的service,service下面創(chuàng)建4個(gè)函數(shù),分別為gen_code, del_code, query_code, use_code, 具體的代碼可以在本文最后附件下載,由于函數(shù)要訪問ots,這邊需要配置service可以讀寫ots的權(quán)限,相關(guān)授權(quán)教程可以參考函數(shù)計(jì)算實(shí)現(xiàn)流式處理大文件中的具體步驟第2步, 本文最后配置如下圖,從下圖可知,我們創(chuàng)建的service的服務(wù)角色是fc-ots-rw,該角色擁有對(duì)ots讀寫的權(quán)限。
具體function
1 生成碼
配置event
{ "num":1000, "start period":"2017-12-22 00:00:00", "end period":"2017-12-28 00:00:00", }
通過這個(gè)配置的event,設(shè)置的目標(biāo)是產(chǎn)生1000個(gè)碼, 碼的有效期在2017-12-22 00:00:00 至 2017-12-28 00:00:00,默認(rèn)產(chǎn)生的狀態(tài)都是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 實(shí)例 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" }
假設(shè)使用碼254804e8-e707-11e7-9c21-0242ac110004,只有表中存在這個(gè)碼并且這個(gè)碼是UNACTIVED才返回SUCCESS,并且把該碼的狀態(tài)設(shè)置為ACTIVED。其他情況,比如不存在這個(gè)碼,或者是存在這個(gè)碼但是已經(jīng)被激活使用過,都返回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" }
假設(shè)查詢碼254804e8-e707-11e7-9c21-0242ac110004,只有表中不存在這個(gè)碼返回NO EXISTED, 存在的話,則返回表中記錄的狀態(tài)
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" }
假設(shè)刪除碼254804e8-e707-11e7-9c21-0242ac110004,不管表中是否存在這個(gè)碼,只要表中沒有這個(gè)碼了就是成功刪除,除非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)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/11812.html
摘要:本文以使用阿里云函數(shù)計(jì)算為例,構(gòu)建一個(gè)簡單具體的為例,看看這種架構(gòu)是如何達(dá)到快速開發(fā)和節(jié)約運(yùn)維成本的。方案在本文中,我們運(yùn)用阿里云函數(shù)計(jì)算表格存儲(chǔ),就能快速搭建這個(gè)服務(wù),會(huì)自動(dòng)去應(yīng)對(duì)請(qǐng)求流量,同樣函數(shù)計(jì)算也會(huì)根據(jù)流量自動(dòng)。 摘要: Serverless 是一種架構(gòu)理念,具有自己的獨(dú)特的優(yōu)勢和適用場景。本文以使用阿里云函數(shù)計(jì)算為例,構(gòu)建一個(gè)簡單具體的microservice為例,看看這種...
摘要:往年回顧氪研究院長期追蹤一級(jí)市場行業(yè)動(dòng)態(tài),深入調(diào)研各領(lǐng)域細(xì)分賽道最具代表性的企業(yè),從行業(yè)發(fā)展環(huán)境成長性競爭格局未來趨勢等角度進(jìn)行分析與研究,輸出了包含人工智能金融教育醫(yī)療交通文娛電商泛科技在內(nèi)的上百份報(bào)告。 showImg(http://upload-images.jianshu.io/upload_images/13825820-d8888a77e920c16f.jpg?imageM...
摘要:另外小程序云應(yīng)用有一套高可用架構(gòu),提供監(jiān)控預(yù)警能力。自主可控小程序云應(yīng)用提供服務(wù)器,開發(fā)者可以擁有登錄或重啟,也可以修改密碼。也就是說,服務(wù)器是由小程序云應(yīng)用提供,但使用權(quán)歸開發(fā)者?! ∏安痪糜幸粋€(gè)朋友問我,到底是做什么端的小程序比較好? 我只問了一句,你的產(chǎn)品里是否涉及錢和服務(wù),如果涉及這兩者,建議你選擇支付寶小程序。你可以通過其他小程序玩裂變,但如果你想做服務(wù)和商業(yè),一定要考慮支付寶...
摘要:如果使用阿里云函數(shù)計(jì)算,您將高峰期每小時(shí)的訪問日志,或者低谷期每小時(shí)的訪問日志交給一個(gè)計(jì)算函數(shù)處理,并將處理結(jié)果存到中。下面結(jié)合阿里云的函數(shù)計(jì)算產(chǎn)品來講解各個(gè)應(yīng)用場景中架構(gòu)以及如何解決的場景中的痛點(diǎn)。 摘要: Serverless概念是近年來特別火的一個(gè)技術(shù)概念,基于這種架構(gòu)能構(gòu)建出很多應(yīng)用場景,適合各行各業(yè),只要對(duì)輕計(jì)算、高彈性、無狀態(tài)等場景有訴求的用戶都可以通過本文來普及一些基礎(chǔ)概...
閱讀 833·2019-08-30 14:05
閱讀 1723·2019-08-30 11:08
閱讀 3226·2019-08-29 15:41
閱讀 3600·2019-08-23 18:31
閱讀 1522·2019-08-23 18:29
閱讀 555·2019-08-23 14:51
閱讀 2114·2019-08-23 13:53
閱讀 2135·2019-08-23 13:02