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

摘要: 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 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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java没有这样的元素异常_java – 没有这样的元素异常?

所以这是我的代码&#xff1a;public static void getArmor(String treasure)throws FileNotFoundException{Random randnew Random();Scanner filenew Scanner(new File ("armor.txt"));while(!file.next().equals(treasure)){file.next(); //stack trace error her…

SDN精华问答 | SDN的核心技术是什么?

SDN火热了好一阵子&#xff0c;无论运营商、政府企业、投资机构&#xff0c;一段时间&#xff0c;不知道SDN、不能甩几个SDN相关的名词术语&#xff0c;似乎都落后于时代了。今天&#xff0c;就来看看关于SDN的精华问答吧。1Q&#xff1a;SDN的目的是什么&#xff1f; A&#x…

RocksDB 写入流程详解

摘要&#xff1a; 最初的写入流程&#xff0c;继承自 leveldb&#xff0c;多个 写线程组成一个 group&#xff0c; leader 负责 group 的 WAL 及 memtable 的提交&#xff0c;提交完后唤醒所有的 follwer&#xff0c;向上层返回。 支持 allow_concurrent_memtable_write 选项&a…

flowable实战(八)flowable核心数据库表详细表字段说明

数据模型设计 清单 数据表分类描述ACT_GE_*通用数据表ACT_RE_*流程定义存储表ACT_ID_*身份信息表ACT_RU_*运行时数据库表ACT_HI_*历史数据库表 通用数据库 数据表描述ACT_GE_PROPERTY属性表(保存流程引擎的kv键值属性)–PropertyEntityImplACT_GE_BTYEARRAY资源表(存储流程定…

Greenplum roaring bitmap与业务场景 (类阿里云RDS PG varbitx, 应用于海量用户 实时画像和圈选、透视)

摘要&#xff1a; 标签 PostgreSQL , Greenplum , varbitx , roaring bitmap , pilosa , varbit , hll , 多阶段聚合 背景 roaring bitmap是一个压缩比很高同时性能不错的BIT库&#xff0c;被广泛使用&#xff08;例如Greenplum, ES, InfluxDB. 点此查看原文 标签 PostgreSQL ,…

容器快速入门完全指南

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | JUSTIN来源 | RancherLabs介 绍容器&#xff0c;以及Docker和Kubernetes之类的容器技术已经日益成为许多开发人员工具包中常见的工具。容器化的核心目标是提供一种更好的方式&#xff0c;以可预测和便于管理的方式在不同的环…

Java错误提示框口怎么使用_如何在Swing中显示错误消息对话框?

以下示例展示了如何在基于swing的应用程序中显示错误消息警告。使用以下API -JOptionPane - 创建标准对话框。JOptionPane.showMessageDialog() - 显示消息警告。JOptionPane.ERROR_MESSAGE - 将警报消息标记为错误。示例package com.yiibai.swingdemo;import java.awt.BorderL…

flowable实战(七)flowable核心数据库表清单

一.工作流部署—RepositoryService 1.流程定义数据表&#xff1a;act_re_procdef 2.流程设计模型部署&#xff1a;act_re_model 3.部署信息表&#xff1a;act_re_deployment 二.工作流运行表—RuntimeService 1.运行时流程人员表&#xff1a;act_ru_identitylink 2.Event…

PostgreSQL Oracle 兼容性之 - rownum

摘要&#xff1a; 标签 PostgreSQL , rownum , Oracle 兼容性 , row_number 窗口 , limit , PPAS , EDB 背景 Oracle ROWNUM是一个虚拟列&#xff0c;每输出一行递增1。 点此查看原文&#xff1a;https://yq.aliyun.com/articles/405183?spma2c4e.11153959.teamhomeleft.24.8W…

PostgreSQL 查询涉及分区表过多导致的性能问题 - 性能诊断与优化(大量BIND, spin lock, SLEEP进程)

摘要&#xff1a; 标签 PostgreSQL , 分区表 , bind , spin lock , 性能分析 , sleep 进程 , CPU空转 , cache 背景 实际上我写过很多文档&#xff0c;关于分区表的优化&#xff1a; 《PostgreSQL 商用版本EPAS(阿里云ppas) - 分区表性能优化 (堪比pg_pathman)》 《PostgreSQL …

flowable实战(九)flowable数据库表中流程实例、活动实例、任务实例三者之间关系分析

场景模拟&#xff08;请假流程&#xff09;&#xff1a; 员工申请请假 部门领导审批 人事审批 员工销假 本文用次例介绍在工作流中出现的几个对象及其之间的关系&#xff0c;以及在Activiti中各个对象是如何关联的。 在线演示实例&#xff1a;http://aws.kafeitu.me:8080/kft…

java maven导入导出_Java +EasyUI+SpringMvc实现Excle导入导出(上)

标签&#xff1a;前言先介绍下项目的开发环境&#xff0c;采用java开发语言进行开发&#xff0c;前台UI使用的是EasyUI框架&#xff0c;接下来是SpringMvc与Ejb结合来开发&#xff0c;整个项目管理采用的是Maven管理&#xff0c;服务器用的是Jboss6.2.0企业版。正文配置对于Exc…

看懂云计算、虚拟化和容器,这一篇就够啦!

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 小枣君来源 | 鲜枣课堂“云计算”这个词&#xff0c;相信大家都非常熟悉。作为信息科技发展的主流趋势&#xff0c;它频繁地出现在我们的眼前。伴随它一起出现的&#xff0c;还有这些概念名词——OpenStack、Hypervisor、KVM…

一张图读懂阿里巴巴一站式研发协同云——云效

摘要&#xff1a; 程序员、测试员、项目经理&#xff0c;你们有freestyle吗&#xff1f;阿里云云效&#xff0c;一站式企业协同研发云&#xff0c;“需求->开发->测试->发布->运维->运营”端到端的协同服务和研发工具支撑&#xff0c;助力企业快速创新迭代和研发…

flowable实战(十)flowable 启动流程到完成所有任务之间的数据库变化

来写一下Activiti 5.18版本从启动流程到整个流程结束之间数据库表的变化 先给出流程图&#xff0c;很简单的流程&#xff0c;就是两个UserTask&#xff1a; 代码如下&#xff1a; DeploymentBuilder builderrepositoryService.createDeployment(); Deployment deploymentbui…

阿里敏捷教练如何优化优酷需求分析流程?

摘要&#xff1a; 如何帮助优酷迅速融合到阿里研发体系&#xff1f;如何优化优酷的需求分析流程&#xff1f;针对需求信息不明确&#xff0c;开发出来的功能不是产品想要的痛点如何解决&#xff1f; 点此查看原文&#xff1a;http://click.aliyun.com/m/41381/ 导读&#xff1a…

java float 高效加减_java Double 进行加减乘除

Double 工具类package org.fh.util;import java.io.Serializable;import java.math.BigDecimal;import java.math.RoundingMode;/*** double的计算不精确&#xff0c;会有类似0.0000000000000002的误差&#xff0c;正确的方法是使用BigDecimal或者用整型* 整型地方法适合于货币…

Gartner预计2019年全球半导体收入将下滑9.6%;苹果中国用户正流向华为;Facebook将支付50亿美元与FTC和解...

戳蓝字“CSDN云计算”关注我们哦&#xff01;嗨&#xff0c;大家好&#xff0c;重磅君带来的【云重磅】特别栏目&#xff0c;如期而至&#xff0c;每周五第一时间为大家带来重磅新闻。把握技术风向标&#xff0c;了解行业应用与实践&#xff0c;就交给我重磅君吧&#xff01;重…

PostgreSQL 多重含义数组检索与条件过滤 (标签1:属性, 标签n:属性) - 包括UPSERT操作如何修改数组、追加数组元素

摘要&#xff1a; 标签 PostgreSQL , 多重函数数组 , UDF索引 , 过滤 , 文本处理 背景 PG的数组类型&#xff0c;被广泛应用于 画像系统 &#xff0c; 标签系统。 在一些业务重建中&#xff0c;对数组内容的定义往往包含了多重含义&#xff0c;例如即包含了标签本身&#xff0c…

flowable实战(十一)flowable 删除数据库表先后顺序

工作流表删除顺序 drop table act_evt_log; drop table act_hi_actinst; drop table act_hi_attachment; drop table act_hi_comment; drop table act_hi_detail; drop table act_hi_identitylink; drop table act_hi_procinst; drop table act_hi_taskinst; drop table act_hi…