대기열에서 항목을 처리하는 작업자 역할이 있습니다. 기본적으로 큐의 항목을 비우고 비동기 적으로 처리하는 무한 루프입니다.작업자 역할 프로세스 - 구성 값 폴링
작업자 역할을 변경할 때 다시 시작해야하는 두 가지 구성 설정 (PollingInterval
및 MessageGetLimit
)이 있으므로 다시 시작하지 않아도됩니다.
private TimeSpan PollingInterval
{
get
{
return TimeSpan.FromSeconds(Convert.ToInt32(RoleEnvironment.GetConfigurationSettingValue("PollingIntervalSeconds")));
}
}
private int MessageGetLimit
{
get
{
return Convert.ToInt32(RoleEnvironment.GetConfigurationSettingValue("MessageGetLimit"));
}
}
public override void Run()
{
while (true)
{
var messages = queue.GetMessages(MessageGetLimit);
if (messages.Count() > 0)
{
ProcessQueueMessages(messages);
}
else
{
Task.Delay(PollingInterval);
}
}
}
는 문제 : 피크 시간 동안
는, while 루프는 초당 몇 번을 실행 할 수있다. 즉, 하루에 최대 100,000 번까지 구성 항목을 쿼리하게됩니다.
이것은 해롭거나 비효율적입니까?
실제로 이것을 구현 했으므로 도움보다 많은 문제가 발생했습니다. 대기열을 사용하여 예상되는 지연이 발생하는 미니 작업을 구현했습니다. 불행히도, 폴링을 백 오프 한 상태에서 클라이언트가 30 개의 요청/미니 작업을 한 번에 보낼 수있는 상황이 있었고 한 달에 몇 달러를 절약하기 위해 노력한 페니였습니다. 이러한 요청은 불필요한 임계 값으로 지연되었습니다. –
지연은 메시지 처리를 기다리는 최대 시간입니다. 2 초인 경우 2 초 이상 기다려서는 안됩니다. 시스템은 메시지 처리를 마친 직후에 다시 점검하기 전에 다른 메시지가 있는지 확인해야합니다. 항상 즉각적인 응답을 원하면 긴밀한 루프를 유지하거나 대기열 이외의 것을보십시오. 나는 이것이 어떤 경우에 두려워 할 수 있다는 것에 동의 할 것이지만 인간의 개입을 정기적으로 요구하는 것을 넣는 것도 좋지 않다. 결국 더 많은 비용이 들게 될 것입니다. – MikeWo