成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Serverless在游戲、電商行業(yè)的一個(gè)運(yùn)用場景示例

Fourierr / 2773人閱讀

摘要:本文以使用阿里云函數(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

相關(guān)文章

  • Serverless游戲電商行業(yè)一個(gè)運(yùn)用場景示例

    摘要:本文以使用阿里云函數(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為例,看看這種...

    Anchorer 評(píng)論0 收藏0
  • 2019風(fēng)向趨勢分析報(bào)告——覆蓋5G、人工智能、金融科技等領(lǐng)域

    摘要:往年回顧氪研究院長期追蹤一級(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...

    Moxmi 評(píng)論0 收藏0
  • 小程序上云,有點(diǎn)猛

    摘要:另外小程序云應(yīng)用有一套高可用架構(gòu),提供監(jiān)控預(yù)警能力。自主可控小程序云應(yīng)用提供服務(wù)器,開發(fā)者可以擁有登錄或重啟,也可以修改密碼。也就是說,服務(wù)器是由小程序云應(yīng)用提供,但使用權(quán)歸開發(fā)者?! ∏安痪糜幸粋€(gè)朋友問我,到底是做什么端的小程序比較好?   我只問了一句,你的產(chǎn)品里是否涉及錢和服務(wù),如果涉及這兩者,建議你選擇支付寶小程序。你可以通過其他小程序玩裂變,但如果你想做服務(wù)和商業(yè),一定要考慮支付寶...

    jsdt 評(píng)論0 收藏0
  • 基于阿里云Serverless架構(gòu)下函數(shù)計(jì)算最新應(yīng)用場景詳解(一)

    摘要:如果使用阿里云函數(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ǔ)概...

    Eidesen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Fourierr

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<