摘要开发者通过函数工作流,无需配置和管理服务器,以无服务器的方式构建应用,便能开发出一个弹性高可用的后端系统。托管函数具备以毫秒级弹性伸缩、免运维、高可靠的方式运行,极大地提高了开发和运维效率,减小了运作成本。

函数工作流(FunctionGraph,FGS)是一项基于事件驱动的函数托管计算服务,托管函数具备以毫秒级弹性伸缩、免运维、高可靠的方式运行。通过函数工作流,开发者无需配置和管理服务器,只需关注业务逻辑,编写函数代码,以无服务器的方式构建应用,便能开发出一个弹性高可用的后端系统,并按实际运行消耗的资源计费。极大地提高了开发和运维效率,减小了运作成本。

相比于传统的架构,函数工作流构建的无服务器架构具有如下优点:

1. 无需关注任何服务器,只需关注核心业务逻辑,提高开发和运维效率;

2. 函数运行随业务量弹性伸缩,按需付费,执行才计费,对于访问量波峰波谷非常明显的场景可以减少大量成本;

3. 通过简单的配置即可连通函数工作流和其它各云服务,甚至云服务和云服务;

为了进一步让大家感受函数工作流的优势,我们将介绍如何通过函数工作流快速构建一个无服务器的敏感词过滤系统,本文我们主要关注后端系统,前端的表现形式很多,大家可以自行构建。如下图,该系统会识别用户上传的文本内容是否包含敏感信息(如色情、政治等),并对这些词语进行过滤。

试想,如果我们通过传统的模式开发此应用,需要如何开发?

即使是基于现在的云平台,我们也仍需要购买云服务器,关注其规格、镜像、网络等各指标的选型和运维,然后在开发过程中可能还需要考虑与其他云服务的集成使用问题,使代码中耦合大量非业务代码,并且服务器等资源也并非是按需的,特别是对于访问量波峰波谷非常明显的场景,会造成大量多余的费用。

现在我们可以通过函数工作流服务来快速构建这个系统,并且完全无需关注服务器,且弹性伸缩运行、按需计费,如图:

创建函数,在函数中调用华为云内容检测服务提供的文本检测接口,实现文本的敏感词检测,并为该函数配置一个APIG触发器,对外提供敏感词过滤的API,从而构建出一个完整的敏感词过滤的无服务器系统。客户端调用API,他会自动触发函数执行,而开发者编写的函数只需实现接收到文本之后如何处理文本的逻辑(调用内容检测服务服务)即可,最后将结果返回给客户端。至此,我们就构建了一个完整的无服务器敏感词过滤系统。

现在,我们将介绍如何端到端地将此无服务器系统构建出来。

1. 准备工作

进入华为云内容检测服务,申请开通文本内容检测,成功申请后边可以调用内容检测服务提供的文本检测接口了。

2. 创建函数

进入函数工作流服务页面,创建函数,实现文本检测的接口调用和敏感词过滤,代码如下(Python):

# -*- coding:utf-8 -*-

import json

import base64

import urllib

import urllib2

import ssl

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

def do_filter(msg,str_list):

result = ''

try:

if len(str_list) <=0:

return msg

for str in str_list:

str_tmp = msg.replace(str,'')

msg = str_tmp

result = msg

except:

print("_do_filter catch an exception!")

return result

def filter(context, msg):

result = ''

try:

ssl._create_default_https_context = ssl._create_unverified_context

token = context.getToken();

headers = {'Content-Type':'application/json;charset=utf8','X-Auth-Token':token}

url = "https://ais.cn-north-1.myhwclouds.com/v1.0/moderation/text"

values = {}

values['categories'] = ['porn','ad','politics','abuse','contraband']

#msg = base64.b64encode(msg)

item = {'type':'content','text':msg}

values['items'] = [item]

data = json.dumps(values)

print("data: %s"%data)

request = urllib2.Request(url,data,headers)

rsp = urllib2.urlopen(request)

http_rsp = rsp.read()

print("http response: %s" %http_rsp)

json_rsp = json.loads(http_rsp)

result = json_rsp['result']

suggestion = result['suggestion']

if suggestion == 'pass':

print("input msg have passed the checking!")

result = msg

else:

detail = result['detail']

if detail.has_key('porn'):

list_porn = detail['porn']

msg = do_filter(msg,list_porn)

if detail.has_key('ad'):

list_ad = detail['ad']

msg = do_filter(msg,list_ad)

if detail.has_key('politics'):

list_politics = detail['politics']

msg = do_filter(msg,list_politics)

if detail.has_key('abuse'):

list_abuse = detail['abuse']

msg = do_filter(msg,list_abuse)

if detail.has_key('contraband'):

list_contraband = detail['contraband']

msg = do_filter(msg,list_contraband)

result = msg

except Exception, e:

print e

print("filter catch an exception!")

return result

def handler (event, context):

print("message filter begin!")

result = ""

response = {}

http_method = event.get('httpMethod')

if http_method == 'OPTIONS':

response = {

'statusCode': 200,

'isBase64Encoded': True,

'headers': {

"Content-Type": "application/json; charset=utf-8",

"Access-Control-Allow-Origin": "*",

"Access-Control-Allow-Headers": "Content-Type,Accept",

"Access-Control-Allow-Methods": "GET,POST,PUT,DELETE"

},

'body': base64.b64encode('{"result":'+ '"' + result +'"}'),

}

return response

body = event.get('body')

body_decode = base64.b64decode(body)

json_object = json.loads(body_decode)

msg = json_object['msg']

print('msg : %s'%msg)

try:

result = filter(context, msg)

response = {

'statusCode': 200,

'isBase64Encoded': True,

'headers': {

"Content-Type": "application/json; charset=utf-8",

"Access-Control-Allow-Origin": "*",

"Access-Control-Allow-Headers": "Content-Type,Accept",

"Access-Control-Allow-Methods": "GET,POST,PUT,DELETE"

},

'body': base64.b64encode('{"result":'+ '"' + result +'"}'),

}

except:

print("function catch an exception!")

return response

函数创建完成之后,为其配置具有IAM访问权限的委托,因为本函数代码中获取用户的ak、sk需要拥有访问IAM的权限。

3. 创建APIG触发器

为函数配置一个APIG触发器,这样便得到一个调用该函数的HTTP(S) API,供外部调用。

4. 测试

使用postman等工具向上一步中创建的APIG触发器的接口发送post请求,body体为:{“msg”: “过滤检测的文本”},查看返回信息。

比如发送 {"msg": "just fuck ..."},返回体为 {"result": "just  ..."}

自此,我们就完整地实现了一个无服务器的敏感词过滤后端系统。

华为云内容检测:http://t.cn/Re83wmV

华为云函数工作流:http://t.cn/Re8uuX7

5分钟构建无服务器敏感词过滤后端系统(基于FunctionGraph)的更多相关文章

  1. 5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统

    前言 在上一篇“5分钟Serverless实践”系列文章中,我们介绍了什么是Serverless,以及如何构建一个无服务器的图片鉴黄Web应用,本文将延续这个话题,以敏感词过滤为例,介绍如何构建一个无 ...

  2. 5分钟Serverless实践:构建无服务器的图片分类系统

    前言 在过去“5分钟Serverless实践”系列文章中,我们介绍了如何构建无服务器API和Web应用,从本质上来说,它们都属于基于APIG触发器对外提供一个无服务器API的场景.现在本文将介绍一种新 ...

  3. 5分钟Serverless实践 | 构建无服务器图片鉴黄Web应用

    Serverless是什么 Serverless中文译为“无服务器”,最早可以追溯到2012年Ken Fromm发表的<Why The Future Of Software And Apps I ...

  4. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  5. java实现敏感词过滤(DFA算法)

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...

  6. 用php实现一个敏感词过滤功能

    周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...

  7. 浅析敏感词过滤算法(C++)

    为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个TreeNode. STL::map是按照operator<比较判断元素是否相同,以及 ...

  8. Java实现敏感词过滤

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  9. Java实现敏感词过滤(转)

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

随机推荐

  1. socket模型

    Socket: "主机" + "端口" = 套接字/插座; 仅仅是一个通信模型,不属于七层协议(网络协议). 一台电脑(IP)的一个应用程序(端口) 和 另一台 ...

  2. mac 下 配置appium +ios真机环境

    mac系统:10.11.6 xcode:7 appium:1.5.3 iphone: 6 p 1.搭建 appium 安卓的环境: 1.jdk 2.sdk 3.appium 4.配置环境变量 mac下 ...

  3. HDLM命令dlnkmgr详解之二__help/clear

    1.help操作 主要显示命令的帮助信息. 显示所有操作的帮助信息 -bash-3.2# dlnkmgr help dlnkmgr: Format dlnkmgr { clear | help | o ...

  4. 部署和调优 1.9 samba 部署和优化-3

    实践2 要求:共享一个目录,使用用户名和密码登录后才可以访问,要求可以读写 打开配置文件 vim /etc/samba/smb.conf 改为security = user 在最后面增加一段 [den ...

  5. eclipse DDMS导出文件失败--android Failed to push the item

    我们在写安卓程序的时候,经常会用Eclipse导出模拟器的文件管理里面的文件,但有时候会报错,导致无法导出文件. 报错信息 Failed to push selection: Local path d ...

  6. hibernateTemplate方法使用

  7. windows 7 系统装机优化

    A:系统设置 1.控制面板\系统和安全\Windows Update\更改设置  把系统升级以及提示关闭      控制面板\系统和安全\Windows 防火墙\自定义设置 把专用网络和公共网络的防火 ...

  8. 【摘自张宴的"实战:Nginx"】Nginx的server指令

    server 语法:server name[parameters] 默认值:none 使用环境:upstream 该指令用于指定后端服务器的名称和参数.服务器的名称可以是一个域名.一个IP地址.端口号 ...

  9. 100211D Police Cities

    传送门 分析 看到这个题我们的第一反应自然是Tarjan缩点,在这之后我们可以发现实际只要在缩点之后所有出度或入度为0的点布置警察局就可以达到要求,我们用dpij表示考虑前i个出度或入度为0的点共布置 ...

  10. linux没有wifi

    linux的wifi出现问题的介绍 几次重装linux系统,经常出现没有wifi的状况 错误详情 之前安装过CentOS,Kylin,OpenSU,等等经常出现没有wifi的状况,虽说猜测是遇到驱动问 ...