항목이 대기열에있을 때 트리거되는 Azure에 Function app가 있습니다. 다음과 같이 표시됩니다 (크게 단순화).Azure에서 동시 작업 수 제한 queue
public static async Task Run(string myQueueItem, TraceWriter log)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(Config.APIUri);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
StringContent httpContent = new StringContent(myQueueItem, Encoding.UTF8, "application/json");
HttpResponseMessage response = await client.PostAsync("/api/devices/data", httpContent);
response.EnsureSuccessStatusCode();
string json = await response.Content.ReadAsStringAsync();
ApiResponse apiResponse = JsonConvert.DeserializeObject<ApiResponse>(json);
log.Info($"Activity data successfully sent to platform in {apiResponse.elapsed}ms. Tracking number: {apiResponse.tracking}");
}
}
이 모든 것이 훌륭하게 작동합니다. 항목이 대기열에 놓일 때마다 우리는 우리 측의 일부 API로 데이터를 보내고 응답을 기록합니다. 시원한.
"대기열 메시지를 생성하는 것"에 큰 영향이있을 때 문제가 발생하며 많은 항목이 한 번에 대기열에 저장됩니다. 이것은 분당 약 1,000 ~ 1,500 개의 항목에서 발생하는 경향이 있습니다. Functions.SendToLimeade : 기능을 실행하는 동안 예외 :
2017-02-14T01 : 45 : 31.692 mscorlib에 오류 로그는 다음과 같이해야합니다. f-SendToLimeade __- 1078179529 : 요청을 보내는 동안 오류 이 발생했습니다. 시스템 : 원격 서버에 연결할 수 없습니다. 시스템 : 각 소켓 주소 (프로토콜/네트워크 주소/포트)의 하나의 사용 만 정상적으로 허용됩니다. 123.123.123.123:443.
처음에는 로컬 소켓이 부족한 Azure Function 앱에 문제가 있다고 생각했습니다 (illustrated here). 그러나 그때 나는 IP 주소를 알아 차렸다. IP 주소 123.123.123.123 (물론이 예의 경우 변경됨)은 HttpClient가 게시하는 IP 주소입니다. 그래서, 지금은 그들이 우리의 서버가 이러한 요청을 처리하기 위해 실행되는 궁금 해서요.
어느 쪽이든, 우리는 여기서 스케일링 문제가 발생합니다. 나는 그것을 해결하는 최선의 방법을 찾아 내려고 노력하고있다.
몇 가지 아이디어 :
- 는 로컬 소켓 제한의 경우, article above이
Req.ServicePoint.BindIPEndPointDelegate
를 사용하여 로컬 포트 범위를 증가의 예를 가지고있다. 이것은 유망한 것처럼 보이지만, 당신이 할 때 당신은 무엇을합니까 진정한 규모가 필요합니까? 나는이 문제가 2 년 후에 돌아 오기를 원하지 않는다. - 원격 제한 사항 인 경우 함수 런타임에서 한 번에 처리 할 메시지 수를 제어 할 수있는 것처럼 보입니다. 여기에 흥미로운 기사가 있습니다.
serviceBus.maxConcurrentCalls
을 1로 설정하면 한 번에 하나의 메시지 만 처리됩니다. 어쩌면 이것을 상대적으로 낮은 숫자로 설정할 수 있습니다. 이제는 대기열이 처리 할 수있는 것보다 빠르게 채워질 수 있지만, 그 시점에서 우리는 서버를 추가 할 것입니다. - 여러 개의 Azure 함수 apps? 둘 이상의 Azure 함수가 있고 모두 같은 큐에서 트리거하면 어떻게됩니까? Azure는 기능 앱간에 작업을 분배 할만큼 똑똑하고 대기열을 처리하는 군대를 가질 수 있습니다. 필요에 따라 확장 또는 축소 할 수 있습니까?
- 나는 또한 keep-alives를 발견했습니다. 큐 메시지가 넘쳐 흐르고있는 상황에서 어떻게 든 소켓을 열어 둘 수 있다면 아마도 도움이 될 것입니다. 이게 가능 한가요?이 일을 어떻게 할 것인지에 대한 조언이 있습니까?
이러한 유형의 시스템에 권장되는 (확장 가능한!) 디자인에 대한 통찰력은 대단히 감사하겠습니다!
는 지금, 그것은 보인다. 따라서 새로운 기능 앱을 추가하는 부분은 필요하지 않습니다. 그것은 이미 이것을합니다. 소켓 오류 메시지가 Azure의 로컬 인스턴스에 소켓이 없거나 여기에있는 서버에 소켓이 없다는 것이 확실하지 않은지 나는 여전히 불분명합니다. –
내 대답도 아래에 추가되었습니다. 이것은 지금까지 우리를 위해 일하는 것 같습니다! –
이 비슷한 질문/답변도 관심의 대상 일 수 있습니다. https://stackoverflow.com/questions/40094041/throttling-azure-storage-queue-processing-in-azure-function-app – Alex