什么是IVS Chat Rooms
Amazon IVS Chat 是一种可扩展的流式聊天功能,具有内置的审核选项,旨在伴随实时流式视频。通过 IVS Chat,观众可以通过提问和参与讨论来建立社区关系。IVS Chat 提供房间资源管理和用于发送、接收和审核聊天消息的消息传递 API。
原理图
需求介绍
1. ivs chat 直播聊天功能
2. 聊天内容审查机制,提供给lambda的自定义处理方案
我们今天就配合ivs chat 来实现带有审核机制的直播聊天室,话不多说先上这块的架构图
IVS Chat: 是IVS的聊天室功能,IVS Chat 提供了wws用于我们使用websocket 去send聊天信息
Check IVS Chat Lambda:用于check 聊天室是否有非法字符和一些相关聊天信息的缓存逻辑
DynamoDb:非关系型数据库,是aws提供的NoSQL,可以实现无缝扩展和高可用。
Web Lambda: 直播web应用程序
api gateway: api 网关用于 client 请求weblambda的一个中间层。
redis:是用来缓存ivs chat token信息和其他数据的
由于我们是在做实验所以我们先手动创建一个IVS Chat Rooms
创建一个lambda并绑定一个role
给role添加ivs chat 的策略
创建一个IVS Chat Rooms
我们创建一个ivs chat rooms 输入聊天室名称和开启审核处理程序,很显然审核处理程序的业务逻辑需要我们自己实现,我们的框架设计也是这样实现的。
创建完成后我们可以看到几个数据:1.arn: 是我们在调用ivs chat rooms的aws boto3的api的时候我们会用到这个,用于标识我们在操作的是那个chat rooms2.Messaging endpoint:消息传递端点是需要我们发送信息的时候需要用websocket 建立连接的时候使用的。3.Chat tokens: 我们在连接websocket的时候需要用的token认证,这个token可以创建很多个,但是token是有生命周期的,我们需要将token缓存的redis里面用于发送给前端在建立连接的时候使用。
好我们构建聊天室的前置工作都做完了
如何使用python实现websocket send message
上代码
#client.py
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE,SIG_DFL)
s_url = "这里是Messaging endpoint"
chat_client_token = "这里是Chat tokens 在业务代码里面是从redis里面获取的"
import uuid
import json, time
import websocket
import threading
def run(ws):while True:message = input()print(message,1111)payload = { "Action": "SEND_MESSAGE","RequestId": str(uuid.uuid1()),"Content": message,"Attributes": {"CustomMetadata": "test metadata"}}ws.send(json.dumps(payload))def open(wsapp):thread = threading.Thread(target=run,args=(wsapp,))thread.start()def on_message(wsapp, message):print(message)def on_error(wsapp, err):print("EXAMPLE error encountered: ", err)def on_cont_message(wsapp,):message = input()print(message,1111)payload = { "Action": "SEND_MESSAGE","RequestId": str(uuid.uuid1()),"Content": message,"Attributes": {"CustomMetadata": "test metadata"}}ws.send(json.dumps(payload))
protocol_str = "Sec-WebSocket-Protocol: " + chat_client_tokenws = websocket.WebSocketApp(url = s_url, header=[protocol_str], on_message=on_message, on_error=on_error, on_open=open)
ws.run_forever()
# check ivs lambda
import json
import boto3def lambda_handler(event, context):# TODO implementprint(event)client = boto3.client('ivschat')if event.get('Content') == "www":response = client.delete_message(id=event.get("MessageId"),reason='ceshi',roomIdentifier=event.get("RoomArn"))print(response)return {'statusCode': 200,'body': json.dumps('Hello from Lambda!')}
代码逻辑
1. 我们使用的websocket中的WebSocketApp,WebSocketApp对websocket做了进一步的封装并提供了几种回调方案,例如:on_message, on_open, on_error, on_closeurl: websocket的地址。header: 客户发送websocket握手请求的请求头,{'head1:value1','head2:value2'}。on_message: 这个对象在接收到服务器返回的消息时调用。有两个参数,一个是该类本身,一个是我们从服务器获取的字符串(utf-8格式)。on_open: 在建立Websocket握手时调用的可调用对象,这个方法只有一个参数,就是该类本身。on_error: 这个对象在遇到错误时调用,有两个参数,第一个是该类本身,第二个是异常对象。on_close: 在遇到连接关闭的情况时调用,参数只有一个,就是该类本身。on_cont_message:这个对象在接收到连续帧数据时被调用,有三个参数,分别是:类本身,从服务器接受的字符串(utf-8),连续标志。on_data:当从服务器接收到消息时被调用,有四个参数,分别是:该类本身,接收到的字符串(utf-8),数据类型,连续标志。run_forever:用于做websocket长连接的,可以通过源码我们可以看到她在不停的
2.我使用ws.run_forever()简历了长链接,因为我们首次建立连接websocket 会回调on_open函数,这时候我们开一个线程来做send message的动作,
将我们要发送的消息投送到IVS Chat 的server里面去,这时候IVS Chat 会触发lambda函数从而进行对消息的check,看是否是合法的和将聊天信息存入
到数据库里面。
3. check ivs lambda 这是一个测试代码,这段代码主要是我们遇到www的信息就删除它,我们来看一下效果。
当我们使用发送别的信息的时候,我们可以看到type是message 说明我们发送成功了
当我们发送www的时候我们可以看到多了一条type为event的回调消息,Eventname是DETETE_MESSAGE,说明我们已经将这条消息删除了,前端小朋友只要收到这条消息就可以将消息删除掉了。
好了这就是我们这次IVS Chat 实现聊天功能的实验代码,具体的功能还需要按照项目需求去精心的打磨