Service Fabric에서 호스팅되는 상태 저장 서비스를 작성하고 있습니다. 서비스의 역할은 외부 대기열의 메시지를 사용하고이를 변환하여 자체 메시징 시스템에 배치하는 것입니다. 처리량은 공급 업체 문서에 따라 초당 최대 6k 메시지가 될 수 있습니다.
메시지로드를 분산시키기 위해 서비스를 여러 파티션으로 구성했으며 각 파티션에는 최소 2 / 최대 3 개의 복제본이 있습니다. 장애를 복구하기 위해 공급 업체 대기열에 가입하고 메시지를 받고 싶은 시점의 타임 스탬프를 전달할 수 있습니다. 이를 위해 서비스 상태에서 처리 된 마지막 메시지의 타임 스탬프를 저장합니다. 메시지의 양 때문에 나는 타이머에 이것을 '저장'하기로 결정했습니다 (그리고 잠재적 인 메시지 중복을 허용합니다)
이것은 시간에 의해 호출되는 코드입니다.
private async void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
var saveRetryPolicy = Policy
.Handle<Exception>()
.WaitAndRetryAsync(5, retryAttempt =>
TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))
);
await saveRetryPolicy.ExecuteAsync(async () =>
{
using (var tx = _stateManager.CreateTransaction())
{
var state = await _stateManager.TryGetAsync<IReliableDictionary<string, long>>(TimestampStateName);
if (state.HasValue)
{
await state.Value.AddOrUpdateAsync(tx, TimestampStateName, _lastTXTimestamp,
(s, l) => _lastTXTimestamp);
await tx.CommitAsync();
}
else
{
var s =
await _stateManager.GetOrAddAsync<IReliableDictionary<string, long>>(tx, TimestampStateName);
await tx.CommitAsync();
_timer_Elapsed(this, null);
}
}
});
}
이것을 지속하려고 할 때마다 각 파티션에서 'System.Fabric.FabricNotPrimaryException'오류가 발생합니다.
재시도 정책 (Poly Retry 제공)을 포함했습니다.이를 권장하는 유사한 문제에 대한 의견이 있습니다. 이것은 효과가 없었고 오류가보고되기까지의 시간을 연장 시켰습니다.
SF가 어떻게 사용되어야하는지에 대한 근본적인 오해가 있습니까? 이것은 나에게 간단한 사용 사례로 보입니다.
댓글 답변 :
모든 복제본에서 타이머를 시작하지 않고 기본 복제본에서만 타이머를 시작해야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다