本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
儀表 AWS Lambda 功能
記分保持使用兩個 AWS Lambda 功能。第一個是來自 lambda
分支的 Node.js 函數,會為新使用者產生隨機名稱。當使用者在未輸入名稱的情況下建立工作階段時,應用程式會使用 AWS SDK for Java呼叫名為 random-name
的函數。適用於 Java 的 X-Ray SDK 會記錄子區段中呼叫 Lambda 的相關資訊,就像使用已檢測的 AWS SDK 用戶端進行的任何其他呼叫一樣。
注意
執行 random-name
Lambda 函數需要在 Elastic Beanstalk 環境之外建立其他資源。如需詳細資訊和指示,請參閱讀我檔案:AWS
Lambda 整合
第二個函數 (scorekeep-worker
) 是一種 Python 函數,會在 Scorekeep API 之外獨立執行。遊戲結束時,API 會將工作階段 ID 及遊戲 ID 寫入 SQS 佇列。工作者函數會從佇列讀取項目,並呼叫 Scorekeep API 來建構每個遊戲工作階段的完整記錄,以儲存在 Amazon S3 中。
Scorekeep 包括用於創建這兩個功能的 AWS CloudFormation 模板和腳本。因為您需要將 X-Ray SDK 與函數代碼捆綁在一起,因此模板創建了沒有任何代碼的函數。部署 Scorekeep 時,包含在 .ebextensions
資料夾中的組態檔會建立包含軟體開發套件的來源套件,並使用 AWS Command Line Interface更新函數程式碼及組態。
隨機名稱
Scorekeep 會在使用者未登入或未指定任何使用者名稱啟動遊戲工作階段時呼叫隨機名稱函數。Lambda 處理呼叫時random-name
,會讀取追蹤標頭,其中包含由 X-Ray SDK for Java 撰寫的追蹤識別碼和取樣決策。
對於每個取樣的請求,Lambda 都會執行 X-Ray 精靈並寫入兩個區段。第一個區段會記錄呼叫函數之 Lambda 的相關資訊。此區段包含與記分守記錄的子區段相同的資訊,但從 Lambda 的角度來看。第二個區段則代表函數進行的工作。
Lambda 會透過函數內容,將函數區段傳遞至 X-Ray SDK。檢測 Lambda 函數時,不會使用 SDK 為傳入請求建立區段。Lambda 提供區段,您可以使用 SDK 來檢測用戶端並撰寫子區段。
random-name
函數實作於 Node.js 中。它使用 Node.js JavaScript 中的 SDK 透過 Amazon SNS 傳送通知,而 Node.js 的 X-Ray 開發套件則使用 SDK 來檢測 AWS SDK 用戶端。為寫入標註,函數會使用 AWSXRay.captureFunc
建立子區段,然後在受檢測函數中寫入標註。在 Lambda 中,您不能將註釋直接寫入函數段,只能將註釋寫入您建立的子區段。
範例 function/index.js
-- 隨機名稱 Lambda 函數
var AWSXRay = require('aws-xray-sdk-core');
var AWS = AWSXRay.captureAWS(
require('aws-sdk'))
;
AWS.config.update({region: process.env.AWS_REGION});
var Chance = require('chance');
var myFunction = function(event, context, callback) {
var sns = new AWS.SNS();
var chance = new Chance();
var userid = event.userid;
var name = chance.first();
AWSXRay.captureFunc('annotations', function(subsegment){
subsegment.addAnnotation('Name', name);
subsegment.addAnnotation('UserID', event.userid);
});
// Notify
var params = {
Message: 'Created randon name "' + name + '"" for user "' + userid + '".',
Subject: 'New user: ' + name,
TopicArn: process.env.TOPIC_ARN
};
sns.publish(params, function(err, data) {
if (err) {
console.log(err, err.stack);
callback(err);
}
else {
console.log(data);
callback(null, {"name": name});
}
});
};
exports.handler = myFunction;
此函數會在您將簡易應用程式部署到 Elastic Beanstalk 時自動建立。該xray
分支包括用於創建空白 Lambda 函數的腳本。.ebextensions
資料夾中的組態檔案會在部署npm install
期間建置函數套件,然後使用 AWS CLI 更新 Lambda 函數。
工作程序
受檢測工作者函數會在自己的分支 (xray-worker
) 中提供,因為除非您先建立工作者函數及相關資源,否則它便無法執行。如需說明,請參閱分支讀我檔案
該功能由捆綁的 Amazon CloudWatch 事件每 5 分鐘觸發一次。當它執行時,函數會從 Scorekeep 管理的 Amazon SQS 佇列中提取項目。每個訊息都包含完整遊戲的相關資訊。
工作者會從遊戲記錄參考的其他資料表提取遊戲記錄及文件。例如,DynamoDB 中的遊戲記錄包含在遊戲期間執行的動作清單。清單不包含移動本身,但包含存放在單獨資料表中移動的 ID。
工作階段及狀態也會以參考存放。這可避免遊戲資料表中的項目過大,但需要額外的呼叫才能取得所有遊戲相關資訊。工作者會解除參照所有這些項目,並在 Amazon S3 中將遊戲的完整記錄建構為單一文件。當您想要對資料進行分析時,可以使用 Amazon Athena 直接在 Amazon S3 中對其執行查詢,而無需執行大量讀取資料遷移即可將資料從 DynamoDB 中取出。
工作者函數在其位於 AWS Lambda內的組態中已啟用主動式追蹤。與隨機名稱函數不同,Worker 不會從已檢測的應用程式接收要求,因此 AWS Lambda 不會收到追蹤標頭。透過使用中追蹤,Lambda 會建立追蹤 ID 並做出取樣決策。
適用於 Python 的 X-Ray 開發套件只是函數頂端的幾行,可匯入 SDK 並執行其patch_all
函數來修補它用來呼叫 Amazon SQS AWS SDK for Python (Boto) 和 Amazon S3 的 HTTP 用戶端和 HTTP 用戶端。工作者呼叫 Scorekeep API 時,軟體開發套件會將追蹤標頭新增至請求,來追蹤透過 API 進行的呼叫。
範例 _lambda/scorekeep-worker/scorekeep-worker.py
-- 工作者 Lambda 函數
import os
import boto3
import json
import requests
import time
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all
patch_all()
queue_url = os.environ['WORKER_QUEUE']
def lambda_handler(event, context):
# Create SQS client
sqs = boto3.client('sqs')
s3client = boto3.client('s3')
# Receive message from SQS queue
response = sqs.receive_message(
QueueUrl=queue_url,
AttributeNames=[
'SentTimestamp'
],
MaxNumberOfMessages=1,
MessageAttributeNames=[
'All'
],
VisibilityTimeout=0,
WaitTimeSeconds=0
)
...