摘要: Serverless 是一种架构理念,具有自己的独特的优势和适用场景。本文以使用阿里云函数计算为例,构建一个简单具体的microservice为例,看看这种架构是如何达到快速开发和节约运维成本的。

点此查看原文: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 WriteRetryPolicytable_name = 'code'  # 具体的table
ots_name = 'code-ots'  # ots 实例
BATCH_NUM =  200def 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.credentialsclient = OTSClient(endpoint, creds.accessKeyId,  creds.accessKeySecret, ots_name, sts_token = creds.securityToken, retry_policy = WriteRetryPolicy())while num > 0:w_num = numif num > BATCH_NUM:w_num = BATCH_NUMbatch_write_row(client, start, end, w_num)num = num - w_numdef 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 jsontable_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.credentialsclient = 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,jsontable_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\tvalue:%s\ttimestamp:%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.credentialsclient = 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 jsontable_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.credentialsclient = 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)复制代码

Serverless在游戏、电商行业的一个运用场景示例相关推荐

  1. PPT 下载 | 神策数据朱静芸:电商行业精细化运营四大场景

    本文内容根据神策数据分析师朱静芸在<数据分析-运营与产品场景的应用实践>主题沙龙中演讲整理所得.主要内容包括: 精细化运营的四个关键词 场景 1:小程序产品的用户分析运营 场景 2:新用户 ...

  2. 智禾教育:现在入局电商行业算晚吗,行业前景将会如何发展

    首先电商的兴起,是因为价格的吸引力,你不得不承认,当初淘宝网,包括之后兴起的各路电商平台,目的都是首先明确它的经济性能,能用较低的价格买到跟实体同等的产品,是多么的具有诱惑力.目前的电商,已经从单纯的 ...

  3. Java开源的规则引擎 Drools 电商行业实战(含完整代码)

    前言 我所在项目组刚好接到一个领取优惠券需求,具体需求是用户领取的各种类型的优惠券(比如:代金券.折扣券)数量不能超过某个自定义数量,因考虑到领取限制数量是动态的,另外考虑到扩展性,满足将来业务规则的 ...

  4. 2020年生鲜电商行业市场分析,二线及以下城市或将成为生鲜电商的一个重要增长点

    据相关数据显示,我国城镇区民年食品支出近七万元亿元,2020年突如其来的疫情,生鲜电商迎来了蓬勃发展.截止到2020年7月,网上食品消费同比增长近四成,生鲜电商月活用户超过7100万,同比增长达到75 ...

  5. 2023年跨境电商行业研究报告

    第一章 行业发展 1.1 概况 跨境电商(Cross-border e-commerce)是指通过互联网销售商品或服务,跨越国家或地区边界,实现国际贸易的一种商业模式.跨境电商的兴起得益于全球化和数字 ...

  6. 电商行业线上活动方式有哪些优缺点(一)

    电商行业线上活动方式有哪些优缺点(一) 如今电商行业发展的越来越快速,而且电商行业的线上活动营销方式也越来越多,商家们总能把握住各种节假日做营销活动.例如三月份的三八妇女节,传统的节假日,十一月份和十 ...

  7. 【历史上的今天】9 月 25 日:谷歌进军电商行业;摩托罗拉诞生;神舟七号发射成功

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 9 月 25 日,伟大的文学家鲁迅诞生在 140 年前的今天,他是 20 世纪的文化巨人,以文字为武 ...

  8. 神策数据首度公开「电商行业事件设计埋点模板」

    近日,神策数据依托服务的 1000 余家企业客户的数据采集实战经验,将沉淀的企业数据采集埋点的最佳实践通过<企业埋点体系搭建方法论及实践经验>白皮书分享给广大企业或数据分析爱好者,颇受好评 ...

  9. 搜索 | 电商行业模版驱动业务增长实践

    简介:阿里巴巴技术专家介绍如何通过开放搜索电商行业增强版,快速构建更高水准的搜索服务,带动业务指数级增长. 讲师:徐希杰--阿里巴巴技术专家 视频地址:https://developer.aliyun ...

最新文章

  1. 47分钟,BERT训练又破全新纪录!英伟达512个GPU训练83亿参数GPT-2 8B
  2. 如何处理SAP Fiori Launchpad错误消息:Could not start the app due to a configuration problem
  3. Tutorial 2: Requests and Responses
  4. 考研分享:三战南大,考研的路上你从不孤独(内附500G最新考研资料分享)
  5. 疫情期间不忽略障碍群体刚需、仍坚持做无障碍的倡议书
  6. 从0开始html前端页面开发_CSS实现图像获取鼠标焦点逐渐变大动画效果
  7. MySQL数据库基础
  8. 乐高机器人巡线C语言程序,乐高机器人巡线原理.doc
  9. 今日头条信息流 - 基础账户实操
  10. React-native开发-Unrecognized font family ‘Ionicons’
  11. Python爬取京东图书销量榜
  12. CentOs7+安装ApacheOpenOffice实现DOC转PDF详解(解决乱码问题)
  13. 计算机管理员权限设置在哪里设置方法,计算机管理员权限在哪里设置 电脑系统如何设置管理员权限...
  14. Flowable深入浅出-14 Flowable-BPMN操作流程之任务完成
  15. 视频播放可弹出弹幕,关闭弹幕
  16. “任知阁”怎么样,我已经踩过了
  17. 互联网日报 | 蔚来汽车股价年内涨幅近十倍;小米成立可穿戴部;恒大物业拟12月2日港交所上市...
  18. matplotlib - 自定义散点形状marker的3种方法
  19. django项目manage.py指定IP和端口
  20. html文件有可能是病毒吗,请问:网页病毒是怎么回事?

热门文章

  1. python快速入门答案-Python 快速入门笔记(1):简介
  2. windows命令行帮助文档如何使用
  3. vim中搭建与sourceinsight类似功能
  4. redis中的ziplist
  5. usaco Mother's Milk
  6. FFT IP核调用与仿真之SCALE压缩因子设置
  7. 关于libnmap 的一些应用
  8. Tomcat9+eclipse如何发布网站
  9. [排序算法] 选择排序(2种)
  10. C语言语法之运算符及优先级