Phát lại luồng trực tiếp theo yêu cầu với Amazon IVS (3 phần sê-ri) |
---|
2 Cách lưu trữ tin nhắn trò chuyện trên web bằng Amazon IVS Chat Logging |
3 Phát lại luồng trực tiếp Amazon IVS với Phát lại trò chuyện |
Trong bài đăng trước , chúng ta đã xem xét cách tự động ghi các luồng trực tiếp của Amazon Interactive Video Service (Amazon IVS) vào bộ chứa Amazon Simple Storage Service (Amazon S3). Tính năng đó là một công cụ mạnh mẽ cho các nền tảng nội dung do người dùng tạo (UGC) vì đây là bước đầu tiên trong việc cung cấp chế độ xem theo yêu cầu các luồng trực tiếp trước đó trong một ứng dụng. Tuy nhiên, việc phát lại luồng trực tiếp sẽ không đầy đủ nếu không có ngữ cảnh đầy đủ của các cuộc trò chuyện tương tác diễn ra bên cạnh luồng. Trong bài đăng này, chúng tôi sẽ thực hiện bước tiếp theo để cung cấp trải nghiệm theo yêu cầu đầy đủ bằng cách tìm hiểu cách ghi nhật ký tin nhắn trò chuyện Amazon IVS.
Tương tự như cách ghi tự động vào Amazon S3 yêu cầu cấu hình ghi, ghi nhật ký trò chuyện cũng yêu cầu cấu hình xác định các chi tiết cần thiết cho phòng trò chuyện. Hãy nhớ rằng bạn cũng có thể cần thêm quyền IAM tùy thuộc vào lựa chọn đích ghi nhật ký của bạn.
Để tạo cấu hình ghi nhật ký với Bảng điều khiển Amazon IVS, nhấp vào Cấu hình ghi nhật ký ở thanh bên trái.
Trên trang danh sách Cấu hình ghi nhật ký , nhấp vào Tạo cấu hình ghi nhật ký .
Ghi nhật ký trò chuyện Amazon IVS cung cấp một số đích để lưu trữ các tin nhắn trò chuyện đã ghi. Chúng ta có thể chọn từ Amazon CloudWatch, Amazon Kinesis Data Firehose hoặc Amazon S3 làm đích lưu trữ cho nhật ký trò chuyện của bạn. Cá nhân tôi thấy CloudWatch là điểm đến thuận tiện nhất vì tôi có thể dễ dàng truy xuất tin nhắn trò chuyện qua CloudWatch SDK, vì vậy, hãy sử dụng điều đó cho bản trình diễn này. Tham khảo tài liệu nếu bạn muốn sử dụng Amazon Kinesis Data Firehose hoặc Amazon S3 làm đích đến trong ứng dụng của mình.
Lưu ý : Có thể có một chút chậm trễ giữa thời điểm tin nhắn trò chuyện được đăng và khi tin nhắn đó xuất hiện tại đích ghi nhật ký của bạn. Đối với Amazon S3, độ trễ có thể lên tới 5 phút và đối với Amazon CloudWatch và Amazon Kinesis Data Firehose, độ trễ có thể lên tới 10 giây.
Để tạo cấu hình cho bản minh họa này, hãy nhập tên cấu hình Ghi nhật ký (#1), chọn CloudWatch làm Đích (#2), chọn Tạo nhóm nhật ký CloudWatch mới (#3) và nhập tên nhóm Nhật ký (#4) .
Nhập bất kỳ Thẻ tùy chọn nào rồi nhấp vào Tạo cấu hình ghi nhật ký .
Giống như với cấu hình ghi, chúng ta có thể tận dụng AWS SDK để tạo cấu hình ghi nhật ký. Vì chúng ta đang đăng nhập vào CloudWatch trong bài đăng này nên chúng ta sẽ cần sử dụng CloudWatch Logs SDK để tạo một nhóm nhật ký .
import { CloudWatchLogsClient, CreateLogGroupCommand } from "@aws-sdk/client-cloudwatch-logs"; const cloudWatchLogsClient = new CloudWatchLogsClient(); const createLogGroupInput = { logGroupName: 'ivs-demo-chat-logging-group', }; const createLogGroupRequest = new CreateLogGroupCommand(createLogGroupInput); const createLogGroupResponse = await cloudWatchLogsClient.send(createLogGroupRequest); console.log(createLogGroupResponse);
Bây giờ chúng ta có thể sử dụng ứng dụng trò chuyện Amazon IVS để tạo cấu hình ghi nhật ký ( docs ).
import { IvschatClient, CreateLoggingConfigurationCommand } from "@aws-sdk/client-ivschat"; const ivsChatClient = new IvschatClient(); const createLoggingConfigInput = { name: 'ivs-demo-chat-logging-config-sdk', destinationConfiguration: { cloudWatchLogs: { logGroupName: 'ivs-demo-chat-logging-group' } } }; const createLoggingConfigRequest = new CreateLoggingConfigurationCommand(createLoggingConfigInput); const createLoggingConfigResponse = await ivsChatClient.send(createLoggingConfigRequest); console.log(createLoggingConfigResponse);
Điều này sẽ tạo ra đầu ra tương tự như sau:
{ "$metadata": { "httpStatusCode": 200, "requestId": "[redacted]", "cfId": "[redacted]", "attempts": 1, "totalRetryDelay": 0 }, "arn": "arn:aws:ivschat:us-east-1:[redacted]:logging-configuration/[redacted]", "createTime": "2023-01-09T14:48:35.358Z", "destinationConfiguration": { "cloudWatchLogs": { "logGroupName": "ivs-demo-chat-logging-group" } }, "id": "[redacted]", "name": "ivs-demo-chat-logging-config-sdk", "state": "ACTIVE", "tags": {}, "updateTime": "2023-01-09T14:48:35.485Z" }
Chúng tôi cũng có thể tùy chọn tạo cấu hình ghi nhật ký qua AWS CLI. Một lần nữa, chúng ta sẽ phải tạo nhóm nhật ký CloudWatch, sau đó chuyển tên của nhóm nhật ký mới vào cấu hình nhật ký trò chuyện.
$ aws logs \ create-log-group \ --log-group-name ivs-demo-logging-config-log-group $ aws ivschat \ create-logging-configuration \ --name ivs-demo-logging-config \ --destination-configuration cloudWatchLogs={logGroupName=ivs-demo-logging-config-log-group}
Giờ đây, chúng tôi có thể liên kết cấu hình ghi nhật ký với phòng trò chuyện Amazon IVS hiện có. Chọn Phòng bên dưới Trò chuyện ở thanh bên trái, chọn phòng mà bạn muốn liên kết với cấu hình, sau đó nhấp vào Chỉnh sửa .
Trên trang chỉnh sửa phòng, cuộn xuống và chọn Tự động ghi nhật ký tin nhắn và sự kiện (#1). Trong danh sách thả xuống Cấu hình ghi nhật ký (#2), tìm kiếm và liên kết cấu hình mà chúng tôi đã tạo ở trên. Lưu ý rằng bạn có thể liên kết nhiều cấu hình với một phòng, vì vậy nếu bạn cũng muốn đăng nhập vào Amazon Kinesis Data Firehose hoặc Amazon S3, bạn có thể tạo các cấu hình riêng biệt và liên kết chúng với phòng của mình. Cũng lưu ý rằng bạn có thể tạo một cấu hình hoàn toàn mới trực tiếp từ trang phòng chỉnh sửa bằng cách nhấp vào nút Tạo cấu hình ghi nhật ký (#3).
Liên kết cấu hình ghi nhật ký với Phòng trò chuyện Amazon IVS hiện có thông qua AWS SDK
Trong sản xuất, bạn có thể sẽ sử dụng SDK để liên kết cấu hình ghi nhật ký của mình với một phòng trò chuyện mới hoặc hiện có. Để làm điều đó, hãy sử dụng CreateRoomCommand
( docs ) hoặc UpdateRoomCommand
( docs ). Dưới đây là ví dụ về việc cập nhật phòng trò chuyện hiện có với cấu hình ghi nhật ký trò chuyện. Theo dự kiến, chúng ta sẽ cần chuyển ARN làm identifier
của phòng trò chuyện và bất kỳ/tất cả ARN cấu hình ghi nhật ký trò chuyện trong một mảng tới loggingConfigurationIdentifiers
.
import { IvschatClient, UpdateRoomCommand } from "@aws-sdk/client-ivschat"; const ivsChatClient = new IvschatClient(); const updateChatRoomInput = { identifier: 'arn:aws:ivschat:us-east-1:[redacted]:room/[redacted]', loggingConfigurationIdentifiers: [ 'arn:aws:ivschat:us-east-1:v:logging-configuration/[redacted]', ] }; const updateChatRoomRequest = new UpdateRoomCommand(updateChatRoomInput); const updateChatRoomResponse = await ivsChatClient.send(updateChatRoomRequest); console.log(updateChatRoomResponse);
Lưu ý: Bạn có thể chỉ định nhiều cấu hình ghi nhật ký cho phòng trò chuyện. Điều này cho phép bạn sử dụng nhiều điểm đến, nếu muốn. Mảng số nhận dạng ghi nhật ký trò chuyện mà bạn chuyển qua SDK tới
UpdateRoomCommand
sẽ ghi đè lên bất kỳ số nhận dạng hiện có nào, vì vậy nếu bạn đang thêm một cấu hình bổ sung, hãy đảm bảo bao gồm mọi ARN cấu hình hiện có để tránh xóa chúng.
Tại thời điểm này, tất cả tin nhắn mới được đăng lên phòng trò chuyện Amazon IVS sẽ được ghi vào (các) đích được chỉ định bởi (các) cấu hình ghi nhật ký đính kèm. Như đã đề cập ở trên, trong trường hợp CloudWatch là đích ghi nhật ký, chúng ta có thể sử dụng CloudWatch SDK để truy xuất nhật ký trò chuyện của mình trong một khoảng thời gian nhất định. Để làm điều này, chúng ta cần logGroupName , dấu thời gian bắt đầu và kết thúc (ở định dạng dấu thời gian Unix) và logStreamNames . LogStreamName sẽ có định dạng: aws/IVSChatLogs/1.0/room_[suffix of chat room ARN]
. Vì vậy, đối với phòng trò chuyện có ARN là arn:aws:ivschat:us-east-1:[redacted]:room/0wgOPVl4ZRdu
, logStreamName sẽ là aws/IVSChatLogs/1.0/room_0wgOPVl4ZRdu
.
Dưới đây là cách sử dụng CloudWatchLogsClient
để tạo FilterLogEventsCommand
( docs ) được sử dụng để truy xuất nhật ký trò chuyện.
import { CloudWatchLogsClient, FilterLogEventsCommand } from "@aws-sdk/client-cloudwatch-logs"; const cloudwatchClient = new CloudWatchLogsClient(); const filterLogEventsInput = { logGroupName: 'demo-chat-log-cw-group', logStreamNames: ['aws/IVSChatLogs/1.0/room_0wgOPVl4ZRdu'], startTime: 1672929210000, endTime: 1672929330000, }; const filterLogEventsRequest = new FilterLogEventsCommand(filterLogEventsInput); const filterLogEventsResponse = await cloudwatchClient.send(filterLogEventsRequest); const events = filterLogEventsResponse.events.map(e => JSON.parse(e.message));
Làm cách nào để biết thời gian bắt đầu và kết thúc để sử dụng? Hãy nhớ rằng Amazon IVS gửi các sự kiện tới EventBridge khi truyền phát tới một kênh. Bạn có thể sử dụng thời gian bắt đầu và kết thúc luồng nếu đang cố truy xuất nhật ký trò chuyện cho một luồng trực tiếp Amazon IVS cụ thể.
Xin lưu ý rằng FilterLogEventsCommand
không thể trả về vô số sự kiện. Bạn có thể phải kiểm tra FilterLogEventsCommandOutput
để biết sự tồn tại của nextToken
và xử lý phân trang nếu khoảng thời gian của bạn có nhiều sự kiện hơn mức có thể phù hợp với một phản hồi từ SDK. Tham khảo tài liệu SDK để biết thêm thông tin.
Theo mặc định, thao tác này trả về nhiều sự kiện nhật ký nhất có thể trong 1 MB (tối đa 10.000 sự kiện nhật ký) hoặc tất cả các sự kiện được tìm thấy trong phạm vi thời gian đã chỉ định. Nếu kết quả bao gồm mã thông báo, điều đó có nghĩa là có sẵn nhiều sự kiện nhật ký hơn. Bạn có thể nhận được kết quả bổ sung bằng cách chỉ định mã thông báo trong cuộc gọi tiếp theo. Thao tác này có thể trả về kết quả trống trong khi có nhiều sự kiện nhật ký hơn thông qua mã thông báo.
Tại thời điểm này, chúng tôi có thể làm bất cứ điều gì chúng tôi cần với nhật ký trò chuyện. Hãy nhớ rằng, ghi nhật ký trò chuyện sẽ ghi nhật ký tất cả các sự kiện được đăng lên phòng trò chuyện Amazon IVS, bao gồm các sự kiện tùy chỉnh và sự kiện liên quan đến kiểm duyệt trò chuyện. Nếu chúng tôi muốn phát lại luồng trò chuyện, có lẽ chúng tôi sẽ cần phân tích cú pháp các sự kiện một chút để xóa các tin nhắn đã kiểm duyệt và tạo luồng tin nhắn "có thể phát lại".
Thông tin thêm về Kiểm duyệt trò chuyện : Nếu bạn chưa đọc chúng, hãy xem các bài đăng trên blog của tôi về kiểm duyệt trò chuyện thủ công và tự động với trò chuyện Amazon IVS.
Một chức năng để phân tích các sự kiện đã ghi có thể trông giống như thế này. Số dặm của bạn có thể thay đổi!
const parseEvents = (events) => { let parsedEvents = []; events.forEach(e => { switch (e.type) { case 'MESSAGE': parsedEvents.push(e); break; case 'EVENT': if (e.payload.EventName === 'aws:DELETE_MESSAGE') { const existingEventIdx = parsedEvents.findIndex(parsedEvent => { return parsedEvent.payload.Id === e.payload.Attributes.MessageID }); if (existingEventIdx > -1) { parsedEvents.splice(existingEventIdx, 1); } } break; } }); return parsedEvents; };
Hàm này sẽ trả về một mảng phù hợp cho mục đích phát lại cuộc trò chuyện với các tin nhắn được kiểm duyệt đã xóa khỏi nhật ký trò chuyện. Đây là một ví dụ nhỏ về cách luồng sự kiện có thể trông như thế nào.
[ { "event_timestamp": "2023-01-05T14:33:32.894Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "WhO6MW6iRdS5", "RequestId": "", "Attributes": { "username": "gleningp" }, "Content": "bbiab!", "SendTime": "2023-01-05T14:33:32.894089757Z", "Sender": { "UserId": "75758272-f3f2-4f65-83c5-9b8f144116b8", "Attributes": {} } }, "version": "1.0" }, { "event_timestamp": "2023-01-05T14:33:39.896Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "VwEPwPV74GN3", "RequestId": "", "Attributes": { "username": "rpeirazzia" }, "Content": "perfect", "SendTime": "2023-01-05T14:33:39.896519733Z", "Sender": { "UserId": "704D6BF8-22D2-4A52-B6A7-BDEFB115ECE5", "Attributes": {} } }, "version": "1.0" }, { "event_timestamp": "2023-01-05T14:33:47.330Z", "type": "MESSAGE", "payload": { "Type": "MESSAGE", "Id": "00kqu1sPa6dF", "RequestId": "", "Attributes": { "username": "jmycroft2" }, "Content": "🔥🔥🔥", "SendTime": "2023-01-05T14:33:47.330983449Z", "Sender": { "UserId": "2F12AA2D-DF65-42CF-AE99-133A5A06F7B4", "Attributes": {} } }, "version": "1.0" } ]
Trong bài đăng này, chúng ta đã tìm hiểu cách ghi nhật ký các tin nhắn đã đăng lên phòng trò chuyện Amazon IVS. Trong bài đăng tiếp theo, chúng ta sẽ xem xét việc kết hợp các luồng trực tiếp được ghi lại tự động và các tin nhắn trò chuyện được ghi lại trong một ứng dụng để tạo trải nghiệm người dùng phát lại "theo yêu cầu" phù hợp.