EventBridge 이벤트 샘플링을 위한 이상한 트릭
17014 단어 awscdkeventbridgeserverlessaws
트릭
2020년 초부터 match events based on complex content patterns이 가능했습니다. EventBridge 이벤트에는 uuid 형식의
id
필드도 항상 포함됩니다. 이 두 속성을 사용하여 주어진 샘플링 비율을 근사화하는 규칙을 만들 수 있습니다. id
필드의 각 문자는 0-f(16진수 값)의 16개 값 중 하나일 수 있습니다. 이는 EventPattern
를 다음과 같이 설정할 수 있음을 의미합니다.{ "id": [{ "prefix": "0" }] }
이것은 이벤트의 1/16 또는 6.25%와 일치해야 합니다. 일치하는 자릿수를 늘려 세분성을 높일 수 있습니다. 2자로 구성된 접두사는 이벤트의 0.39%와 일치하고 3자로 구성된 접두사는 0.0244%의 이벤트와 일치합니다.
예를 들어 이벤트의 1%를 일치시키려는 경우 다음과 같은 접두사 목록을 제공할 수 있습니다.
{
"id": [
{ "prefix": "00" }, // 0.39%
{ "prefix": "01" }, // 0.78%
{ "prefix": "020" }, // 0.81%
{ "prefix": "021" }, // 0.83%
{ "prefix": "022" }, // 0.85%
{ "prefix": "023" }, // 0.88%
{ "prefix": "024" }, // 0.90%
{ "prefix": "025" }, // 0.93%
{ "prefix": "026" }, // 0.95%
{ "prefix": "027" }, // 0.98%
{ "prefix": "028" } // 1.00%
]
}
참고: EventBridge에서 생성된 uuid가 균일하게 배포된다는 보장은 없지만 대부분의 경우 충분합니다.
이러한 접두사 목록을 CDK 구조로 생성하기 위한 논리를 구축할 수 있습니다.
SamplingRule 구문( 코드 )
모든 예제 코드는 이 GitHub 리포지토리에서 찾을 수 있습니다. rogerchi/cdk-events-sampling
현재 AWS-CDK 리포지토리에는 EventBridge 규칙에서 콘텐츠 기반 매처를 정의하기 위한 open issue이 있으므로 구성을 위해 탈출구를 사용하고 기본 L1 CloudFormation 구성으로 드롭다운하여 패턴을 설정해야 합니다.
import { RuleProps, Rule, CfnRule } from 'aws-cdk-lib/aws-events';
import { Construct } from 'constructs';
export interface SamplingRuleProps extends RuleProps {
percentage: number;
}
export class SamplingRule extends Rule {
constructor(
scope: Construct,
id: string,
{ percentage, ...props }: SamplingRuleProps
) {
// Construct the base class with a dummy eventPattern
super(scope, id, { ...props, eventPattern: { version: [''] } });
// Escape hatch for getting the CfnRule to be able to use content-based
// filtering until this issue is resolved:
// https://github.com/aws/aws-cdk/issues/6184
const cfnRule = this.node.defaultChild as CfnRule;
const idPattern = this.getIdPatternFromPercentage(percentage);
if (!props.eventPattern) {
cfnRule.eventPattern = { id: idPattern };
} else {
cfnRule.eventPattern = { ...props.eventPattern, id: idPattern };
}
}
// Convert percentage into list of uuid prefix patterns
private getIdPatternFromPercentage(percentage: number): { prefix: string }[] {
if (percentage >= 1 || percentage <= 0) {
throw new Error('Percentage must be between 0 and 1');
}
// Get the first three significant hex digits from the percentage
const hexString = percentage.toString(16).slice(0, 5).slice(-3);
// Build up list of prefixes, starting from most significant digit
let prefixes: string[] = [];
let a;
for (a = 0x0; a < parseInt(hexString[0], 16); a++) {
prefixes.push(a.toString(16));
}
let b;
for (b = 0x0; b < parseInt(hexString[1], 16); b++) {
prefixes.push(a.toString(16) + b.toString(16));
}
let c;
for (c = 0x0; c < parseInt(hexString[2], 16); c++) {
prefixes.push(a.toString(16) + b.toString(16) + c.toString(16));
}
return prefixes.map((prefix) => ({ prefix }));
}
}
사용 사례
다음은 프로덕션 이벤트 샘플링에 대한 몇 가지 사용 사례입니다.
테스트(코드)
예제 리포지토리에는 프로덕션 이벤트 버스 스택, 개발 이벤트 버스 스택 및 3%의 샘플링 비율을 사용하여 프로덕션 이벤트 버스에서 개발 이벤트 버스로 이벤트 복제를 구성하는 스택과 같은 몇 가지 스택을 생성하도록 설정된 CDK 애플리케이션이 있습니다. CDK 애플리케이션을 샌드박스 계정에 배포하고
scripts/put-events.ts
스크립트를 호출하여 프로덕션 이벤트 버스에 10,000개의 이벤트를 넣습니다. 샘플링 규칙이 이러한 이벤트의 약 3%와 일치하고 이를 개발 스택에 복제할 것으로 예상해야 합니다(물론 개발 스택은 별도의 개발 계정에 있을 수도 있음).ts-node scripts/put-events.ts {prodEventBusName}
이벤트 버스에 대한 CloudWatch 메트릭을 확인하고 이벤트의 2.81%가 샘플링되어 dev 이벤트 버스로 전송되었음을 알 수 있습니다.
결론
SamplingRule 구성/패턴을 사용하여 서버리스 및 이벤트 기반 애플리케이션 개발을 가속화할 수 있기를 바랍니다. 이 정보가 도움이 되었는지 알려주시고 Twitter에서 저를 팔로우해 주세요.
나에 대해서
저는 스태프 엔지니어 @ Veho 입니다. 우리는 최근 시리즈 A 및 B 펀딩 라운드를 모집했으며 적극적으로 채용하고 있습니다! 서버리스에 대한 열정이 있거나 기술을 향상시키려는 경우 당사open positions를 살펴보십시오!
Reference
이 문제에 관하여(EventBridge 이벤트 샘플링을 위한 이상한 트릭), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/aws-builders/one-weird-trick-for-sampling-eventbridge-events-mlp텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)