解读:游戏运营行业,Serverless如何解决数据采集分析痛点?
优采云 发布时间: 2022-11-03 07:24解读:游戏运营行业,Serverless如何解决数据采集分析痛点?
作者 | 纪元
来源|阿里巴巴云原生公众号
众所周知,游戏行业是当今互联网行业的一棵常青树。2019年,疫情前,中国游戏市场收入约2884.8亿元,同比增长17.1%。2020年,受疫情影响,游戏行业突飞猛进。玩游戏是中国网民最常见的娱乐方式之一,尤其是在疫情期间。据不完全统计,截至2019年,中国手游用户规模约为6.6亿,占中国8.47亿网民总数的77.92%。可见,游戏作为一种低门槛、低成本的娱乐手段,已经成为大多数人的生活。习惯的一部分。
对于玩家来说,市面上的游戏数量是压倒性的,那么玩家如何去发现和识别一款游戏并继续玩下去,恐怕是所有游戏厂商都需要思考的问题。除了2018年暂停游戏版号外,游戏厂商珍惜每一款获得版号的游戏产品,因此这也使得“深耕产品品质”和“提升运营精细度”两大游戏产业发展方向成为主流。最受欢迎。游戏厂商的开发思路,无论是新游戏还是老游戏,都在努力落实这两点:
在这里,我们专注于新游戏。一家游戏公司苦苦研发三年,等待新游戏的推出,翱翔天际。那么问题来了,广大玩家会如何看待这款新游戏呢?
首先我们来看看游戏行业公司的分类:
对于这三类业务,有专注于某一领域的独立公司,也有可以承接所有业务的公司,但无论是哪一种,三者之间的关系都不会改变:
所以不难理解,要让更多的玩家看到你的游戏,游戏的发行和运营是关键。通俗地说,如果你的游戏出现在所有知名平台的广告中,至少该游戏的新用户注册数量是相当可观的。所以这引入了一个关键词:买入量。
数据显示,2019年手游月均购买量达到6000+,而2018年仅为4200。另一方面,随着抖音、微博等超级APP的资源在游戏购买上倾斜市场上,手游购买的效果和效率也得到了提升,游戏厂商更愿意使用购买方式。来吸引用户。
不过需要注意的是,在游戏购买精准度不断提升的同时,购买成本也在不断上升。只有合理配置采购、渠道和整合营销的关系,才能分配好宣传资源。达到最大的效果。
通俗的讲,买量其实就是各大主流平台的广告。大部分用户看到游戏广告后,可能会点击广告,然后进入游戏厂商的宣传页面。然后游戏厂商对采集收到的用户信息进行大数据分析,进一步有针对性的推广。
游戏运营核心诉求
游戏厂商花钱买量,换来的用户信息和新用户注册信息都是为了游戏的持续运营,所以这个场景的核心诉求是采集用户信息的完整性。
例如,某游戏厂商每天在广告上花费 5000 瓦,在某个平台上某段时间内产生每秒 1 瓦的广告点击率,那么在此期间每个用户点击某条广告的信息这段时间必须采集完全发送到 ,然后存储起来以供后续分析。这对数据采集系统提出了很高的要求。
其中,最核心的一点是系统暴露接口的环节,必须能够顺利承载进货期间的不规则流量脉冲。在购买期间,游戏厂商通常会在多个平台投放广告,每个平台投放广告的时间不同,因此全天会有不规律的流量脉冲。如果这个环节有问题,那么相当于购买金额的钱就浪费了。
数据采集系统传统架构
上图是比较传统的data采集系统架构。最重要的是暴露HTTP接口返回数据的部分。如果这部分有问题,那么 采集 数据链接将被破坏。但这部分往往面临两个挑战:
一般情况下,在游戏有运营活动之前,会提前通知运维同学给这个环节的服务增加节点,但是无法估计增加多少,只能粗略估算. 这是传统架构中经常出现的场景,会导致两个问题:
数据采集系统无服务器架构
我们可以使用函数计算FC来代替传统架构中暴露HTTP返回数据的部分,从而完美解决传统架构中存在的问题,参考文章:《资源成本双优化!见创新实践》无服务器中断编程教育”。
先看架构图:
传统架构中的这两个问题都可以通过函数计算的 100 毫秒弹性来解决。我们不需要预估营销活动会带来多少流量,也不需要担心和考虑data采集系统的性能,运维同学也不需要提前准备ECS。
由于函数计算具有极大的灵活性,在没有采购或营销活动的情况下,函数计算的运行实例数为零。当有购买活动时,在出现流量脉冲的情况下,函数计算会快速拉起实例来承受流量压力;当流量减少时,函数计算会及时释放没有被请求的实例进行收缩。因此,Serverless 架构带来的优势如下:
图式分析
从上面的架构图可以看出,整个采集数据阶段分为两个功能。第一个函数的作用是简单的暴露HTTP接口来接收数据,第二个函数用来处理数据。然后将数据发送到消息队列 Kafka 和数据库 RDS。
1.接收数据功能
我们打开函数计算控制台,创建一个函数:
创建函数后,我们通过在线编辑器编写代码:
# -*- coding: utf-8 -*-
import logging
import json
import urllib.parse
HELLO_WORLD = b'Hello world!\n'
def handler(environ, start_response):
logger = logging.getLogger()
context = environ['fc.context']
request_uri = environ['fc.request_uri']
for k, v in environ.items():
if k.startswith('HTTP_'):
# process custom request headers
pass
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
# 接收回传的数据
request_body = environ['wsgi.input'].read(request_body_size)
request_body_str = urllib.parse.unquote(request_body.decode("GBK"))
request_body_obj = json.loads(request_body_str)
logger.info(request_body_obj["action"])
logger.info(request_body_obj["articleAuthorId"])
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [HELLO_WORLD]
这时候的代码很简单,就是要接收用户的参数,我们可以调用接口进行验证:
您可以在函数的日志查询中看到此调用的日志:
同时,我们还可以查看函数的link trace来分析每一步的调用时间,比如函数接收请求的过程→冷启动(没有活动实例时)→准备代码→执行初始化方法→执行入口函数逻辑:
从调用链接图中可以看出,之前的请求收录了冷启动时间,因为当时没有活动实例,整个过程耗时418毫秒,入口函数代码的实际执行时间为8毫秒。
再次调用该接口时,可以看到直接执行了入口函数的逻辑,因为此时已经有一个实例在运行,整个时间只有2.3毫秒:
2. 处理数据的函数
第一个函数是通过函数计算控制台在界面上创建的,运行环境选择Python3。我们可以在官方文档中查看预设的Python3运行环境中构建了哪些模块,因为第二个功能需要操作Kafka和RDS,所以需要确认对应的模块。
从文档中可以看出,内置模块包括RDS的SDK模块,但没有Kafka的SDK模块。这种情况下,我们需要手动安装Kafka SDK模块,创建功能也会使用另一种方式。
1) 工艺品
Funcraft是一个支持Serverless应用部署的命令行工具,可以帮助我们方便的管理函数计算、API网关、日志服务等资源。它通过一个资源配置文件(模板.yml)。
所以第二个函数我们需要用Fun来操作,整个操作分为四步:
2) 安装乐趣
Fun提供了三种安装方式:
文本示例环境是Mac,所以使用npm安装非常简单,一行命令就可以搞定:
sudo npm install @alicloud/fun -g
安装完成后。在控制终端输入fun命令查看版本信息:
$ fun --version
3.6.20
第一次使用fun前,需要执行fun config命令进行配置,按照提示依次配置Account ID、Access Key Id、Secret Access Key、Default Region Name。Account ID 和 Access Key Id 可以在函数计算控制台首页右上角获取:
有趣的配置
? 阿里云账号*01
? 阿里云访问密钥ID *qef6j
? Aliyun Access Key Secret *UFJG
? 默认地域名称 cn-hangzhou
? 每个 SDK 客户端调用的超时时间(秒) 60
? 每个 SDK 客户端的最大重试次数 3
3)编写template.yml
创建一个新目录并在此目录中创建一个名为 template.yml 的 YAML 文件。该文件主要描述了要创建的函数的配置。说白了,函数计算控制台上配置的配置信息是用 YAML 格式写的。在文件中:
ROSTemplateFormatVersion: '2015-09-01'
Transform: 'Aliyun::Serverless-2018-04-03'
Resources:
FCBigDataDemo:
Type: 'Aliyun::Serverless::Service'
Properties:
Description: 'local invoke demo'
VpcConfig:
VpcId: 'vpc-xxxxxxxxxxx'
VSwitchIds: [ 'vsw-xxxxxxxxxx' ]
SecurityGroupId: 'sg-xxxxxxxxx'
LogConfig:
Project: fcdemo
Logstore: fc_demo_store
dataToKafka:
Type: 'Aliyun::Serverless::Function'
Properties:
Initializer: index.my_initializer
Handler: index.handler
CodeUri: './'
Description: ''
Runtime: python3
我们来解析一下上面文件的核心内容:
目录结构为:
4)安装第三方依赖
在创建了服务和功能的模板之后,让我们安装我们需要使用的第三方依赖项。在本例的场景中,第二个功能需要用到Kafka SDK,所以可以通过fun工具结合Python包管理工具pip来安装:
fun install --runtime python3 --package-type pip kafka-python
执行命令后,出现如下提示信息:
此时我们会发现目录下会生成一个.fun文件夹,我们安装的依赖都在这个目录下:
5)部署功能
现在模板文件写好了,我们需要的Kafka SDK也安装好了,我们需要添加我们的代码文件index.py。代码内容如下:
# -*- coding: utf-8 -*-
import logging
import json
import urllib.parse
from kafka import KafkaProducer
producer = None
def my_initializer(context):
logger = logging.getLogger()
logger.info("init kafka producer")
global producer
producer = KafkaProducer(bootstrap_servers='XX.XX.XX.XX:9092,XX.XX.XX.XX:9092,XX.XX.XX.XX:9092')
def handler(event, context):
logger = logging.getLogger()
# 接收回传的数据
event_str = json.loads(event)
event_obj = json.loads(event_str)
logger.info(event_obj["action"])
logger.info(event_obj["articleAuthorId"])
# 向Kafka发送消息
global producer
producer.send('ikf-demo', json.dumps(event_str).encode('utf-8'))
producer.close()
return 'hello world'
代码很简单,这里简单分析一下:
登录函数计算控制台,可以看到通过 fun 命令部署的服务和函数:
进入函数,还可以清晰的看到第三方依赖包的目录结构:
3.函数间调用
目前,这两个功能都已创建。下面的工作就是在第一个函数接收到数据后,拉起第二个函数向Kafka发送消息。我们只需要对第一个函数进行一些更改:
# -*- coding: utf-8 -*-
import logging
import json
import urllib.parse
import fc2
HELLO_WORLD = b'Hello world!\n'
client = None
def my_initializer(context):
logger = logging.getLogger()
logger.info("init fc client")
global client
client = fc2.Client(
endpoint="http://your_account_id.cn-hangzhou-internal.fc.aliyuncs.com",
accessKeyID="your_ak",
accessKeySecret="your_sk"
)
def handler(environ, start_response):
logger = logging.getLogger()
context = environ['fc.context']
request_uri = environ['fc.request_uri']
for k, v in environ.items():
if k.startswith('HTTP_'):
# process custom request headers
pass
try:
request_body_size = int(environ.get('CONTENT_LENGTH', 0))
except (ValueError):
request_body_size = 0
<p>
# 接收回传的数据
request_body = environ['wsgi.input'].read(request_body_size)
request_body_str = urllib.parse.unquote(request_body.decode("GBK"))
request_body_obj = json.loads(request_body_str)
logger.info(request_body_obj["action"])
logger.info(request_body_obj["articleAuthorId"])
global client
client.invoke_function(
'FCBigDataDemo',
'dataToKafka',
payload=json.dumps(request_body_str),
headers = {'x-fc-invocation-type': 'Async'}
)
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return [HELLO_WORLD]</p>
如上代码所示,对第一个函数的代码做了三处改动:
def my_initializer(context):
logger = logging.getLogger()
logger.info("init fc client")
global client
client = fc2.Client(
endpoint="http://your_account_id.cn-hangzhou-internal.fc.aliyuncs.com",
accessKeyID="your_ak",
accessKeySecret="your_sk"
)
这里需要注意的是,我们在代码中添加初始化方法时,需要在函数配置中指定初始化方法的入口:
global client
client.invoke_function(
'FCBigDataDemo',
'dataToKafka',
payload=json.dumps(request_body_str),
headers = {'x-fc-invocation-type': 'Async'}
)
invoke_function 函数有四个参数:
通过这个设置,我们可以验证请求是通过第一个函数提供的HTTP接口发起的→采集数据→调用第二个函数→将数据作为消息传递给Kafka。
使用两个函数的目的
这里有同学可能会有疑问,为什么需要两个函数而不是第一个函数直接向Kafka发送数据呢?我们先来看这张图:
当我们使用异步调用函数时,请求的数据会在函数内部默认放入消息队列进行第一次削峰填谷,然后每个队列会通过对应的函数实例的弹性拉起多个实例函数实例。进行第二次削峰填谷。所以这也是这个架构能够稳定承载大并发请求的核心原因之一。
4.配置卡夫卡
在游戏运营场景中,数据量比较大,所以对Kafka的性能要求比较高。与开源自建相比,使用云上的Kafka节省了大量的运维操作,例如:
一般来说,所有的SLA都被云端覆盖了,我们只需要关注消息发送和消息消费即可。
因此,我们可以打开Kafka激活界面,根据实际场景需要一键激活Kafka实例,激活Kafka后登录控制台,在基本信息中查看Kafka接入点:
您可以将默认接入点配置到函数计算的第二个功能中。
....
producer = KafkaProducer(bootstrap_servers='XX.XX.XX.XX:9092,XX.XX.XX.XX:9092,XX.XX.XX.XX:9092')
....
然后点击左侧控制台的Topic Management,创建一个Topic:
将创建的 Topic 配置到函数计算的第二个函数中。
...
# 第一个参数为Topic名称
producer.send('ikf-demo', json.dumps(event_str).encode('utf-8'))
...
上面已经列出了云上 Kafka 的优势,比如动态增加一个主题的分区数,我们可以在主题列表中动态调整一个主题的分区数:
单个主题最多支持360个分区,这是开源自建无法实现的。
接下来,点击控制台左侧的Consumer Group Management,创建一个Consumer Group:
至此,云上的Kafka已经配置完成,即Producer可以向刚刚创建的topic发送消息,Consumer可以设置刚刚创建的GID并订阅Topic进行消息的接收和消费。
Flink 卡夫卡消费者
在这种场景下,Kafka 后面往往会跟着 Flink,所以这里简单介绍一下如何在 Flink 中创建 Kafka Consumer 和消费数据。代码片段如下:
final ParameterTool parameterTool = ParameterTool.fromArgs(args);
String kafkaTopic = parameterTool.get("kafka-topic","ikf-demo");
String brokers = parameterTool.get("brokers", "XX.XX.XX.XX:9092,XX.XX.XX.XX:9092,XX.XX.XX.XX:9092");
Properties kafkaProps = new Properties();
kafkaProps.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);
kafkaProps.put(ConsumerConfig.GROUP_ID_CONFIG, "ikf-demo");
FlinkKafkaConsumer kafka = new FlinkKafkaConsumer(kafkaTopic, new UserBehaviorEventSchema(), kafkaProps);
kafka.setStartFromLatest();
kafka.setCommitOffsetsOnCheckpoints(false);
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource dataStreamByEventTime = env.addSource(kafka);
以上是构建 Flink Kafka Consumer 并添加 Kafka Source 的代码片段,非常简单。
压力测试验证
至此,整个数据采集的架构已经搭建完成。接下来,我们将通过压力测试来测试整个架构的性能。这里使用阿里云PTS进行压力测试。
创建压力测试场景
打开PTS控制台,点击左侧菜单创建压力测试/创建PTS场景:
在场景配置中,使用第一个函数计算函数暴露的HTTP接口作为串口,如下图所示:
接口配置好之后,我们来配置压力:
这里由于资源成本的原因,将并发用户数设置为2500进行验证。
从上面压力测试的情况来看,TPS已经达到2w cap,549w+请求,99.99%的请求成功,369异常也可以点击查看,都是压力的请求超时造成的测试工具。
总结
至此,整个基于serverless的大数据采集传输架构搭建完成,并进行了压力测试,验证整体性能也不错,整个架构非常简单易懂。这种架构不仅适用于游戏运营行业,其实任何大数据采集传输场景都适用。目前,已经有很多客户在基于serverless架构的生产环境中运行,或者正在对serverless架构进行改造。在途中。
基于Serverless的其他应用场景还有很多,后面我会一一分享给大家。
总结:关键词排名权重分析(百度算法推测)
我是三都软件的架构分析师,自己开发了一个SEO管理系统,所以研究了一段时间的百度算法。虽然我们开发的SEO管理系统和原创工具由于SEO行业的低迷而放弃了*敏*感*词*推广,但希望我的研究经验能够启发你的优化思维。
1. 搜索引擎排名关键词的算法
2、原创和伪原创的权重值的算法
3、行业站如何快速提升长尾关键词?
4. SEO策略问题——如何在同样的人工成本下提高效率?
1. 关键词 排名算法
根据多年来与SEO专家和算法工程师的交流,我们推测“关键词的搜索引擎排名算法”主要基于两个因素:网站综合权重和关键词 计算自重指标。
什么是网站综合权重:搜索引擎是根据其他因素综合权重计算出来的。(网站域名长,内容多,链接质量好,外链多,理论上综合权重值更高)
关键词的权重是多少:用流行词来形容(一篇关键词的有效曝光次数),搜索引擎收录一篇文章文章同时时间,如果你的关键词有锚文本,假设搜索引擎给你的关键词权重分数为1分,无锚文本为0.2分;当你有 100 篇带有锚文本的 文章 文章出现 关键词 时,这个 关键词 的权重是 100 分。
了解了以上问题后,我们再举两个例子来说明“关键词排名原理”。
(一)为什么行业关键词做不了高权重的网站?
计算公式=(网站综合重量值*20%)+(关键词重量值*80%)
你的 网站=(100*20%)+(10*80%)=28 分
大网站=(500*20%)+(5*80%)=104点
(综合得分越高,排名越高)
(2)为什么你的一些词在测试前有更高的权重网站?
计算公式=(网站综合重量值*20%)+(关键词重量值*80%)
你的 网站=(100*20%)+(200*80%)=180 分
大网站=(500*20%)+(50*80%)=140点
(当你的关键词分数高时,你可以超越大站)
以上简单的公式可以帮助你理解权重函数在排名中的位置。真正的算法更复杂。我给你写上面两个主要函数值的计算公式。当然,公式中的权重比和分数超出了我的能力范围。准确预测,这些是搜索引擎的秘密,只能通过长期的观察和分析来判断:
网站综合权重值=网站标题词(得分区间20--100/个)+网站关键词(得分区间5-20/个)+友情链接词(2-20/条)+原创文章(0.02-1/条)+伪原创文章(0.001-0.1/条)+外链(0.001-0.1 /条)+访问速度分(5-20/秒)+域名值(0.1-2/月)+非搜索流量值(0.001-0.02/条)-各种罚分(首页关键词叠加、过度的页面优化、垃圾链接、死链接等)
标题,网站关键词这些是根据多少来算的,整个网站给你100分,你写4个关键词换一个网站, main 关键词每个是25分,如果你写20 main 关键词,你得到的分数很低
原创 和 伪原创 是根据质量授予的,我们将在下一节中详细讨论。
关键词重量=收录文章有效关键词(0.1--1/个)+收录外链有效关键词(0.01— 0.1/ item)+关键词有效访问(0.1-0.5/item)+网站标题词(20--100/item)+网站关键词(5-20/piece ) + 好友链词得分(2-20/张)--各种罚分(关键词叠加等)
(同一篇文章文章可以同时获得网站综合权重积分和关键词权重积分)
搜索引擎可以通过增加或减少权重值来改变内容和外部链接的作用。
也就是今天写一篇好文章原创=发100个外链,外链也不是完全没用,而是“工作效率的性价比不大”,所以在第四节,我们来讨论详细《SEO策略问题——如何在相同的人工成本下提高效率。
2、原创和伪原创的权重值的算法
搜索引擎如何为 文章 和 关键词 分配权重?
文章权重值=1*(1/类似文章个数)+有效访问(0.01-0.1/次)-无效反弹(0.01-0.1/次)
(公式假设我预测的值为 1,也可能为 2)
经验好的文章关键词权重会超过1,
跳出高 文章 关键词 权重会低于 1。
我们来详细分析一下文章的权重质量得分:
原创=1*(1/类似文章数字1)=1分
高质量伪原创=1*(1/相似文章数字4)=0.25分
低质量伪原创=1*(1/类似文章50篇文章数)=0.02分
垃圾伪原创=1*(1/类似文章1000条数)=0.001分
(一篇优质文章原创=1000或10000垃圾文章伪原创)
搜索引擎如何确定相似文章的数量?
首先对文章进行分词,
如果不明白分词的意思,就去百度吧,
蜘蛛然后将每个文本与百度数据库进行比较。
计算公式={(每段相同词数/每段分词数)+(每段相同词数/每段分词数)+…}/段数(假设一组100 个字符)
搜索引擎如何找到垃圾邮件文章?
百度从去年开始谈论他们的智能分析系统,
蜘蛛已经能够智能地理解句子是否流畅。
公式1=段落字数/段落字数=小于50%是垃圾
公式2=段落中的分词顺序/完整句子相似度的比较=相似度太低(是句子不流畅)=垃圾文章
3、如何快速提升企业站长尾关键词?
通过上面的讨论,我们基本上可以得出一个结论
企业站想和大型门户网站网站(或垂直行业网站)争夺关键词排名,必须增加关键词的权重,因为你的网站综合权重 超越门户站是不可能的,所以你必须集中精力在长尾词上获得大量权重,这样才能逐步提高整体网站权重。
企业站为什么难建,因为你的文章更新次数太少,所以一个新颖的网站和资源站可以很快发胖,你每天的文章更新都是你几十个次。
我当时开发的原创工具用的是我写的原创段落,所以网络相似度很低,行业相关度很高,并且同步添加了锚文本(记得金华站长肖工具君说:“文章没有锚文本几乎和没贴一样”。)
有的seo说过:我用优采云采集工具来海量发布文章不是吗?刚才的公式告诉你,有几十万个优采云采集同一个文章,你就是那几万个采集人?你知道吗?
四、SEO策略问题——同等人力成本下如何提高效率
我想告诉你管理机会成本的概念。你需要从一个创业者的角度来看待SEO的转化价值。每个 SEO 团队的预算都是有限的。在人力相同的情况下,最好的解决方案是做权重值高的优化,放弃那些价值不大的优化。
为什么SEO没有时间?
因为 SEO 把时间花在做外部链接 + 伪原创(低权重的事情)上
同时,写 原创 的权重要高得多。
我们可以自己编写 原创,为什么要使用您的 原创 工具?
对于每个企业站点,只有几个与您的行业密切相关的 文章 主题方向。每天写一大堆与网站主题无关的文章值得吗?(切记:不相关的文章必须加上关键词,得到的关键词不会有很高的权重!)
其次,原创编辑的最大写作量不会超过8篇/天,那我们就用同一时间让编辑给我们写原创段落,使用原创工具要生成 80 篇文章原创75% degree文章,让我为您计算潜在的权重值:
自己写=8篇*1分=8分/天
原创工具写作=80篇*0.75分=60分/天
另外,您是否计算过发布工作量的成本?你有没有权衡每个休息日的损失?
5年前,几句话就能在首页带来转化,但今天你必须做100个长尾关键词才能带来同样的好处。今天作为一个SEO总监,你应该排不了很多关键词,只想着找老板给你更多的人,你应该考虑在同样的人员情况下,提高几次效率,从而快速提高长尾关键词的排名,有一定数量的客户,有转化价值,老板会不断增加你的SEO投入。
你要知道别人的网站可能比你早一年出发,如果你每天都用他们同样的更新速度,你永远无法超过别人的关键词权重值,一定要给自己的网站零食,一定要给它喂很多原创文章,长尾词权重增加很多,等有一定排名的时候,再与云推特合作免费刷榜互刷工具,提升关键词的经验权重值。
另外,可以关注搜外论坛“傅伟先生的群思”
未来的SEO总决赛势必是大型的比拼和自动化程度的比拼。那么如何才能进一步减少工作量,让SEO团队在同等人力的情况下工作效率提升5倍以上呢?方向。