Datastore에서 확대/축소 및 조회 및 즉시 반영이 가능한 카운터
따라서 Datastore는 카운터가 있는 솔리드를 설계하기 어렵습니다.
예를 들어 mish에서 애니메이션의 재생 수, 평론 수, 페이지 보기 수 등 계수기를 실시했지만 디자인의 난이도가 상당히 높기 때문에 어떻게 실시해야 하는지를 정리했다.
오픈소스로 재활용이 가능하니 가능하면 사용해 보세요.창고.
분산 계수기
상기 제한을 피하고 계수기를 실현하는 모델로 분산계수기라는 디자인 방법이 있다.
const datastore = new Datastore();
const increment = async (id: string) => {
const key = datastore.key(["Counter", `${id}-${Math.floor(Math.random() * 100)}`]);
const transaction = datastore.transaction();
const [entity] = await transaction.get(key);
datastore.update({
key,
data: { id, count: (entity?.count ?? 0) + 1 },
});
await transaction.commit();
};
const getCount = async (id: string) => {
const [distributedCounters] = await datastore.createQuery("Counter").filter("id", "=", id).run();
return distributedCounters.reduce<number>((previous, entity) => previous + entity.count, 0);
};
이 예에서 하나의 id를 위해 100개의 실체를 준비했다.이렇게 되면 업데이트 처리가 분산돼 1초에 100회 정도의 업데이트를 견딜 수 있다.!
이 코드를 직접 사용하지 마세요.
키의 값이 연속되어 있기 때문에 핫스팟 발생합니다.
또한 동작 검증이 수행되지 않았습니다.
과제.
이 방차 계수기도 충분한 상황이 있지만 계수기의 값으로 조회하려는 경우는 충분하지 않다.
const getRanking = async () => {
const [entities] = await datastore.createQuery("Counter").order("count", { descending: true }).run();
return entities;
};
이런 코드를 썼어도 분산된 계수기에 대한 검색은 엉망진창인 값만 얻을 수 있다.통계 분산 계수기
분포식 계수기의 과제를 해결하기 위해서는 합계 계수기를 다른 실체에 넣어야 한다.
몇 가지 통계 방법을 고려할 수 있다.
매일 전체 카운터 합계
바로 떠오르는 것은 하루가 끝날 때 모든 계수기를 조회하고 통계하는 방법이지만 문제점도 바로 떠오른다.
합계 ID에 플래그를 세워 일정 시간마다 합계합니다.
업데이트된 ID의 경우 Memcached 등 KVS 설정 로고를 활용해 몇 분 간격으로 로고가 나타나는 ID만 집계할 수 있다는 점도 문제다.
그럼 어떡하지?
이런 과제들을 해결하기 위해 하는 것은여기.이다.
이 창고는 다음과 같은 동작을 실현했다.
이렇게 되면 increament 때마다 임무가 만들어지지만 1시에는 수행시간이 있고 Datastore 안에 로고가 세워져 있어 임무를 수행하기 전에는 임무를 만들지 않는다.이 하지 않는 시간은 통계가 넘어가지 않도록 이윤을 챙겼다.
또 CloudTasks는 1초에 500회 퀘스트를 완성할 수 있습니다 여분의 작업을 하지 않았기 때문에 1초에 2천500개의 아이디 인크레이션을 할 수 있다.또 이렇게 모자라면 대열 분산을 늘려 규모를 줄일 수도 있다.
시험을 준비하다
Reference
이 문제에 관하여(Datastore에서 확대/축소 및 조회 및 즉시 반영이 가능한 카운터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/malt03/articles/e091ab3ec25f30텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)