2009-06-08 10 views
7

저는 Im 컨설팅 비즈니스를 지원하기 위해 일련의 서비스를 제공하는 SOA 아키텍처를 고려했습니다. 이전에는 각 애플리케이션이 공유 MS SQL 데이터베이스에서 필요한 것을 선택하여 작업 한 데이터베이스 통합을 사용했습니다. 우리는 자바, .net 및 마이크로 소프트 액세스를 포함하여 괴물 데이터베이스와 통합하는 다양한 애플 리케이션을 가지고 있었고, 모든 것이 밀접하게 결합되어 있으므로 참조 무결성이있었습니다.SOA 스타일 - 데이터 공유

서비스 간 데이터 공유를 지원하는 방법에 대해 약간 혼란 스럽습니다.

매월 도매 업체가 제공하는 제품 데이터베이스 위에있는 제품 서비스를 이용할 수 있습니다. 우리는 도메인 모델을 만들고이를 Hibernate 또는 whatvever를 사용하여 데이터베이스에 배치합니다. implentation wise Product는 도매업자가 제품에 대해 제공 한 정보를 제공하는 대형 객체 그래프입니다.

검토 서비스, 가격 서비스, 배송 서비스 및 재고 서비스가 ProductUpdated, ProductAdded, ProductDeleted를 구독하게됩니다. 문제는 각 서비스가 제품에 대한 정보의 일부 또는 일부만 필요로한다는 것입니다. 배송은 치수와 무게 만 필요할 수 있습니다. 가격 책정에는 제품 ID, 도매 비용, 대량 할인, 현재까지 유효한 가격 만 필요할 수 있습니다. 리뷰에 제품 ID, 제품 이름, 제작자가 필요할 수 있습니다.

전체 제품 (적절한 비 구독자 관련 계약 (예 : ProductUpdated) 및 모든 제품 개체 그래프를 나타내는 적절한 스키마)을 게시하고 구독자가 필요한 모든 항목을 도메인 모델에 매핑 할 수있게하는 것은 일반적인 관행입니다 (또는 도대체 ... 그들은 심지어) 도메인 모델이 없을 수도로 원하는

을 아니면 내가이 쓰기로 나는 어쩌면 생각 해요 : 그냥 제품 세부 정보를 포함하지 않습니다 (

제품 서비스 게시합니다 ProductAdded 메시지 제품 ID 및 타임 스탬프)

가격 결정 서비스 su ProductAdded에 bscribes 및 발행 RequestPricingForProduct 메시지

제품 서비스 게시합니다 ResultForPricingForProduct 메시지

흠 .. 보인다 더 작은 ...하지만 난 어떤 다른 서비스 내가 할 수있는 기반으로 제품 서비스에 대한 계약을 짓고 있어요처럼 느낀다 미래 XYZ 서비스에서 아마도 뭔가 다른 것을 요구할 것입니다. 내가 혼란스러워하는 곳에서 더 명확 해지고 있다고 생각되면서 거기에서 멈추게 될 것입니다. 아마도 대중이 옳은 것이 무엇이든지 돌아가는 길을 폭로해야하기 때문에 아마도 위의 것이 효과가있을 것입니다.

모든 의견이나 방향에 크게 감사드립니다. 반쯤 구워지면 죄송합니다.

답변

3

내가 최근에 당신의 자리에 머문 서비스를 통해 기본 객체를 직접 노출하는 문제는 레이어 간의 결합을 증가시키고 서비스 지향 아키텍처를 전혀 사용하지 않는 것입니다. 웹 서비스에도 영향을 미치지 않으면 서 이러한 객체 나 비즈니스 규칙을 변경할 수 없습니다.

제대로 된 것 같습니다. 레이어를 분리하는 것이 중요하다면 가장 일반적인 패턴은 웹 서비스, 잠재적으로 각 서비스에 대한 새로운 별도의 메시지 클래스 집합을 만들고 내부 객체를 앞뒤로 변환하는 것입니다.

이 방법으로 서비스 계층을 설정하는 방법의 예는 "서비스 인터페이스"패턴을 참조하십시오. 서비스의 클라이언트 측에는 "서비스 게이트웨이"라는 반대 패턴이 있습니다.

Application Architecture Guide 2.0에는 작성한 결정의 유형에 대한 전체 장 (http://apparchguide.codeplex.com/Wiki/View.aspx?title=Chapter%2013%20-%20Service%20Layer%20Guidelines)이 있습니다. 나는 전체 가이드를 다운로드 할 것이다.

여기가 가장 관련성이 높은 부분입니다. 간단히 말하자면 새로운 거친 메서드와 메시지 기반 객체를 만드는 데 시간이 걸리면 더 나은 웹 서비스가 제공됩니다.

서비스 인터페이스를 설계 할 때 다음 지침을 고려하십시오 : 요청을 일괄 처리하고 네트워크를 통한 호출 수를 최소화하려면 대단위 인터페이스를 사용하는 것이 좋습니다. 디자인 서비스는 비즈니스 로직에 대한 변경 사항이 인터페이스에 영향을 미치지 않는 방식으로 인터페이스합니다. 서비스 인터페이스에 비즈니스 규칙을 구현하지 마십시오. 다른 유형의 클라이언트와 최대한의 호환성을 제공하기 위해 매개 변수에 표준 형식을 사용할 것을 고려하십시오. 클라이언트가 서비스를 사용하는 방법에 대해 인터페이스 설계에서 가정하지 마십시오. 서비스 인터페이스에 대한 버전 관리를 구현하기 위해 개체 상속을 사용하지 마십시오.

5

실제로이 문제에 대한 해결책은 데이터를 공유하지 않는 것이라고 생각합니다. SOA는 데이터가 서비스에 소유됨을 의미합니다. 이는 해당 데이터의 기술적 권한입니다. Data On The Inside, Data On The Outside과 같은 Pat Helland 기사를 읽는 것이 좋습니다.

서로 다른 서비스간에 공유해야하는 유일한 것은 기본 키입니다 (예 : ProductId). 그렇지 않으면 각 서비스에 대해 트랜잭션 일관성을 유지해야하는 데이터가 함께 사용됩니다.

"제품"이 하나 일 필요는 없습니다. 각 서비스는 자신의 서비스에서 제품에 대한 다른 시각을 가질 수 있습니다. 가격 책정 서비스에는 productId와 가격이 있습니다. 리뷰 서비스를 위해 productId와 리뷰. 등등.

사람들이 혼란에 빠지기 시작한 곳은이 모든 다른 서비스의 UI 인 경우이 데이터를 UI에 표시하는 방법입니다. ProductService의 제품 이름과 ReviewService의 리뷰 텍스트가있는 제품의 리뷰 목록을 어떻게 표시 할 수 있습니까?

그 해답은 모든 다른 서비스에서 UI를 구성하는 것입니다. 제품 서비스에서 제품을 가져 와서 검토 서비스에서 검토 데이터를 가져온 다음 UI에서 해당 데이터를 결합하십시오.