5分钟构建无服务器敏感词过滤后端系统(基于FunctionGraph)
摘要:开发者通过函数工作流,无需配置和管理服务器,以无服务器的方式构建应用,便能开发出一个弹性高可用的后端系统。托管函数具备以毫秒级弹性伸缩、免运维、高可靠的方式运行,极大地提高了开发和运维效率,减小了运作成本。
函数工作流(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)的更多相关文章
- 5分钟Serverless实践 | 构建无服务器的敏感词过滤后端系统
前言 在上一篇“5分钟Serverless实践”系列文章中,我们介绍了什么是Serverless,以及如何构建一个无服务器的图片鉴黄Web应用,本文将延续这个话题,以敏感词过滤为例,介绍如何构建一个无 ...
- 5分钟Serverless实践:构建无服务器的图片分类系统
前言 在过去“5分钟Serverless实践”系列文章中,我们介绍了如何构建无服务器API和Web应用,从本质上来说,它们都属于基于APIG触发器对外提供一个无服务器API的场景.现在本文将介绍一种新 ...
- 5分钟Serverless实践 | 构建无服务器图片鉴黄Web应用
Serverless是什么 Serverless中文译为“无服务器”,最早可以追溯到2012年Ken Fromm发表的<Why The Future Of Software And Apps I ...
- 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)
转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...
- java实现敏感词过滤(DFA算法)
小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...
- 用php实现一个敏感词过滤功能
周末空余时间撸了一个敏感词过滤功能,下边记录下实现过程. 敏感词,一方面是你懂的,另一方面是我们自己可能也要过滤一些人身攻击或者广告信息等,具体词库可以google下,有很多. 过滤敏感词,使用简单的 ...
- 浅析敏感词过滤算法(C++)
为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个TreeNode. STL::map是按照operator<比较判断元素是否相同,以及 ...
- Java实现敏感词过滤
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- Java实现敏感词过滤(转)
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
随机推荐
- C Primer Plus学习笔记(五)- C控制语句:循环
伪代码的概念: 伪代码是一种用简单的句子表示程序思路的方法,它与计算机语言的形式相对应.伪代码有助于设计程序的逻辑.确定程序的逻辑无误之后,再把伪代码翻译成实际的编程代码.使用伪代码的好处之一是,可以 ...
- java 多线程系列---JUC原子类(二)之AtomicLong原子类
概要 AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似.本章以AtomicLong对基本类型的原子类进行介绍. AtomicLong ...
- 类型:.net;问题:ASP.NET路由;结果:ASP.NET 路由 .NET Framework 4
ASP.NET 路由 .NET Framework 4 更新:2007 年 11 月 ASP.NET 路由使您可以使用不必映射到网站中特定文件的 URL.由于 URL 不必映射到文件,所以可以在 ...
- python+requests+excel 接口测试
1.EXCEL文件接口保存方式,如图. 2.然后就是读取EXCEL文件中的数据方法,如下: import xlrd class readExcel(object): def __init__(self ...
- day70-oracle PLSQL_01基本语法
PLSQL是一种程序,和java一样都是一种程序. sql developer是基于java的jdbc连接数据库.根据java的jdbc,只要有数据库的驱动,就可以连接这个数据库.这个工具默认不需要任 ...
- eclipse格式化代码模板
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <profi ...
- C++面向对象类的实例题目五
题目描述: 编写一个程序,采用一个类求n!,并输出5!的值. 程序代码: #include<iostream> using namespace std; class CFactorial ...
- react+node制作在线笔记本(一)
一. 使用react的官方脚手架create-react-app创建项目,为了支持使用sass,我们使用eject命令 这样,我们就可以自由对webpack进行配置了. 二. 首先要安装style-l ...
- TCP/IP的三次握手和四次放手
一开始个人对于三次握手和四次挥手这个东西还是有时候会忘记,可能理解的不是非常深刻,所以今天就自己动手来记录一下这个知识点,方便以后查看.总结完之后发现总结的还是可以的哈哈. 三次握手建立连接 第一次: ...
- 第一个SpringMVC程序(最简单的)
注册中央调度器,这个中央调度器就是org.springframework.web.servlet.DispatcherServlet这个类(web.xml servlet-name节点的名字,必须 ...