2016-11-18 3 views
1

웹 API가 하루 20 시간 동안 일정한 빈도로 호출된다고 가정합니다. API가 호출 된 후에 시작되는 동작은 장시간 실행되며 몇 분 동안 진행될 수 있습니다.작업에서 .ContinueWith를 무기한 호출하면 큐와 루프 스레드를 에뮬레이트 할 수 있습니까?

특정 방식으로 그룹화 된 순서대로 작업을 처리해야합니다. E.G. 이러한 요청이 발생한 회사는 순서에 따라 대기해야하지만 다른 회사의 직원은 동시에 자신의 그룹에서 동시에 실행될 수 있습니다.

대기열과 루프 스레드를 사용하는 대신 GroupId, Task의 사전을 가질 수 있으며 요청이 그룹에 들어올 때마다 ContinueWith로 새 작업을 추가 할 수 있습니까?

10k 요청에 대해 10 밀리 초당 요청과 관련하여 테스트 해 보았습니다. 괜찮 았지만, 프로덕션 환경에서 이것이 어떻게 작동하는지에 대한 경험이나 아이디어가있는 의견이 필요했습니다.

+0

코드의 비트를 공유하는 것이 좋을 것입니다. – mayu

답변

3

기본적인 접근 방식은 소리입니다. 항목의 대기열을 관리하는 TaskQueue 클래스를 만들어 비즈니스 논리에서 사용중인 메커니즘을 추상화하여 추상화로 그 개념을 처리 할 수 ​​있습니다 (코드를 표시하지 않았으므로, 두 항목이 동시에 추가하려고 할 때 경쟁 조건이 없는지 확인하기 위해 이러한 연속을 추가 할 때는주의해야합니다. 특히 과 같이 어려운 것은 아니지만 비즈니스 논리에서 어려운 저수준 스레딩 문제를 생각할 필요가 없다는 것을 의미하므로 매우 유용합니다.

Here은 이러한 용도로 사용할 수있는 클래스의 예입니다.

+0

ConcurrentDictionary를 사용하여 그룹 ID + 태스크를 유지 보수했지만 머리를 고맙게 생각했습니다. 지금 POC 단계에 있습니다. – tylerjgarland

+0

당신의 코드를 체크 아웃하고 정확히 내가 구상하고있는 것입니다. 시간이 지남에 따라이 저하를 보지 못하셨습니까? 몇 달 동안 실행 한 후 1 백만 회의 연속 작업이 메모리 누수가 발생하면 궁금합니다. – tylerjgarland

+0

@tylerjgarland 제대로 구현 된 경우, 아니요. – Servy

관련 문제