여러분 중 일부는이 안내서에 대한 조언을 드릴 수 있기를 바랍니다.데이터베이스 또는 서비스에 대한 일괄 원격 호출을 수행하는 방법은 무엇입니까?
저는 웹 서비스 나 데이터베이스와 같은 원격 리소스를 호출해야하는 코드를 생성합니다.
(50) 어린이를위한 코드class Parent{
IEnumerable<Child> Children;
int SumChildren() {
// note the AsParallel
return Children.AsParallel().Sum(c => c.RemoteCall());
}
}
class Child {
public int RemoteCall() {
// call some webservice. I'd like to pool these calls
// without having to rewrite the rest of this code
}
}
이 조각을 고려, 오버 헤드 50 회 복용, 서비스에 50 개 통화를 할거야. 제 실제 생활의 예에서 이것은 쉽게 모든 일을 크롤링으로 가져 오는 백만 번 전화 일 수 있습니다.
나는 무엇을하고 싶습니다 전화 호출 스레드/작업에 대한 투명 어떤 방식으로 이러한 호출을 일괄 처리하고 싶습니다. 따라서 서비스를 직접 호출하는 대신이 호출을 일괄 처리하는 중앙 대기열 ('기차역')을 호출합니다.
이렇게하면 호출하는 작업이 차단됩니다. 그런 다음 대기열은 X 호출이 누적 될 때까지 대기 한 다음 요청 목록이있는 원격 서비스를 1 번 호출합니다.
결과가 오면이 큐는 반환 값을 올바른 작업으로 반환하고 해당 작업의 차단을 해제합니다. 호출 스레드의 경우이 모든 내용은 숨겨져 있으며 다른 함수 호출처럼 보입니다.
이 작업을 수행 할 수 있습니까? TPL에 이것을 할 수있게 해주는 기본 요소가 있습니까?
다른 것들이 완료되기를 기다리는 동시에 많은 일들이 진행되는 CCR과 같은 냄새가납니다.
물론이 코드를 다시 작성하여 부모 클래스에 대한 요청 목록을 만든 다음 서비스를 호출 할 수 있습니다. 문제는 실제 문제가 발생하면이 코드가 모두 생성된다는 것입니다. 그래서 Child.RemoteCall의 구현을 '내부에서 살펴 봐야'할 것입니다.이 모든 것을 훨씬 더 복잡하게 만듭니다. 또한 자식은 원격 객체에 대한 프록시 일 수 있습니다. 실행 가능하다면 매우 어려울 것입니다.이 복잡성을 분리하려고합니다.
호프는 누군가에게 의미가 있기를 바랍니다. 내가 정교하게 알려주지 않으면.
나는 당신이 풀링을 의미한다고 생각하지 않습니까? 이는 연결을 지능적으로 공유하여 필요 이상으로 열거 나 닫지 않도록합니다 (ADO.NET 고유). 나는 당신이 실제로 일괄 처리 * 요청에 대해 이야기하고 있다고 생각하지만, 호출 앱 (사실상 일종의 프록시)에 대한 개념적으로 투명한 것으로 생각하십니까? – Murph
당신은 일괄 처리에 대해 완전히 맞습니다. 텍스트를 변경했습니다. 고마워. – gjvdkamp
100 만 통화 : 50 명의 자녀를 둔 부모 20,000 명과 1 백만 명의 자녀를 둔 부모 1 명 또는 부모에게 자녀가있는 자녀가 몇 명있는 나무 구조일까요? – richj