2012-07-27 10 views
6

나는 데이터베이스에 이미 많은 기존 데이터를 가지고 있으며, 그들이하는 행동에 따라 각 사용자의 점수를 계산하는 포인트 메커니즘을 개발하려고합니다.스프링에서 포인트 시스템 설계하기

이 기능은 플러그 가능한 방식으로 구현되므로 기본 로직과 독립적이며 엔티티가 수정 된 후에 보내지는 Spring 이벤트에 의존합니다.

문제는 기존 데이터를 어떻게 처리해야하는지입니다. 지금부터 포인트를 수집하기 시작하고 싶지는 않지만 지금까지 모든 데이터를 포함하고 있습니다.

이렇게하는 가장 효과적인 방법은 무엇입니까? 내 시스템이 데이터베이스에서 모든 단일 엔티티를 가져오고, EntityDirtyEvent를 보내고, 포인트 플러그인을 시작하고, 각각에 대해 업데이트하도록 index() 메소드를 제공하는 방식으로 플러그인을 디자인해야합니까? 포인트를 각 엔티티 옆에 저장하도록합니다. 오버 헤드가 많이 발생할 수 있습니다.

가장 간단한 것은 복잡한 저장 프로 시저를 만든 다음 저장 프로 시저의 index() 호출을 만드는 것입니다. 그러나 나에게는 나쁘다고 생각됩니다. 어쨌든 자바에서 포인트를 계산하기위한 논리를 작성해야 할 것이므로 SQL로 다시 한 번 가져야합니다. 또한 일반적으로 비즈니스 논리를 다른 계층으로 분할하는 팬이 아닙니다.

이전에이 작업을 수행 한 사람이 있습니까? 도와주세요.

답변

4

먼저 구현 전략과 비즈니스 규칙을 구분 해 보겠습니다.

이미 데이터가 있으므로 데이터에서 직접 결과를 가져 오는 것이 좋습니다. 이것은 데이터 도메인 모델을 형성합니다. 모든 데이터를 저장할 데이터 모델을 설계하십시오. 그런 다음 쿼리, 뷰 및 저장 프로 시저 집합을 만들어 데이터에 액세스하고 업데이트합니다.

이러한 뷰가 있으면 스프링 JDBC 템플릿과 같은 데이터 액세스 라이브러리를 사용하여이 데이터를 가져 와서이를 Java 객체 (목록,지도, 사람, 포인트 테이블 등)로 나타낼 수 있습니다.

시스템의 상위 계층에서 어떤 일이 발생했는지에 관계없이 지금까지 완료 한 내용은 많이 변경되지 않습니다. 이를 모델이라고합니다.

그런 다음 입력, 사용자 조치, 데이터 조건 또는 다른 모든 조건에 필요한 데이터를 결정하는 룰베이스 또는 논리 구현을 개발하십시오. 수학적 의미에서 이것은 매트릭스와 같습니다. 프로그래밍에서, 이것은 논리 문장의 집합이 될 것입니다. 이것이 사실이라면이 데이터를 얻고, 그렇지 않으면 그 데이터를 얻습니다. 이것은 시스템의 논리를 포함합니다. 따라서 "컨트롤러"라고합니다.

이 논리를 쿼리/저장 프로 시저/뷰로 이동하지 마십시오.

그런 다음 마지막으로 프론트 엔드 또는 "콘솔"을 개발하십시오. 가장 단순한 경우, 콘솔 입력 시스템을 개발하십시오. 콘솔 입력 시스템은 ..을 입력하고 일련의 결과를 표시합니다. 이것이 시스템의 "보기"입니다.

결국 웹 응용 프로그램으로보기를 개발할 수 있습니다. 위의 명령 줄보기는 여전히 안정적인 API 서버의 형태로 실행 가능할 수 있습니다.

2

여기에는 고려해야 할 한 가지 문제가 있습니다. 데이터베이스에 거대한 데이터가 있다는 것을 이해하면 포인트 시스템을 계산하는 메커니즘 하나만을 만드는 것이 최선의 방법 일 수는 없습니다.

사실 포인트 수집을 시작하지 않고 모든 데이터를 포함하려면 지금 가지고있는 정보를 처리하고 계산해야합니다. 예, 처음 실행하면 오버 헤드가 발생할 수 있지만 앞에서 말했듯이이 데이터를 계산해야합니다.

다른 한편으로 엔티티의 변경 사항을 적용하고이 특정 수정에 적용되는 새로운 지시 사항을 계산할 수있는 다른 프로세스를 시작하는 또 다른 메커니즘을 포함 할 수 있습니다.

따라서 하나의 엔티티와 다른 엔티티에 대해 하나씩 포인팅 시스템을 계산하는 책임을 맡은 하나의 서비스를 사용하여 더 이상 완료 할 수 없으며 글로벌 포인트를 계산할 수 있습니다. 심지어 실시간으로 계산할 필요가없는 경우 실행 계획 작업을 생성 할 수 있습니다.

마지막으로 비즈니스 로직을 두 개의 레이어 (Db + Java)로 분할하는 것은 좋은 방법이 아니라는 것을 알고 있습니다. 예를 들어 마침내 작동하는 요청에 신속하게 응답해야하는 경우가 있습니다. 많은 레지스트리. 데이터베이스에 비즈니스 로직을 추가하는 것 (스토어드 프로 시저 등으로)보다 많은 데이터를 관리하고 최종 결과를 브라우저 클라이언트에 반환하는 것 외에는 다른 옵션이 없다는 것을 발견했습니다 (예 : 특정 시간의 계산 프로세스).

2

"부트 스트랩"을 수행하려고합니다. 선택한 방식은 포인트 계산이 얼마나 복잡한 지에 따라 달라집니다. 저장 프로 시저 또는 일반 업데이트 문이 가장 간단한 솔루션 인 경우 그렇게하십시오.

계산이 복잡하면 기존 데이터를로드하고 가장 오래된 데이터를 가장 먼저 주문한 다음 해당 데이터에 해당하는 이벤트가 방금 발생한 것처럼 일괄 처리 작업을 작성하십시오. 이벤트를 처리하는 코드는 미래의 이벤트를 처리 할 코드와 정확히 같아야하므로 배치 작업 자체 이외의 추가 코드를 작성할 필요가 없습니다.

이 제품을 한 번 실행해야하므로 빠르고 간단하지만 더 간단합니다.

2

옳은 방향으로 가고있는 것 같습니다. 당신은 당신의 "포인트"가 메인 어플리케이션으로부터 분리되기를 원한다는 것을 알고 있습니다. 이미 당신이 최대 절전 모드 (태그에 의해!)를 사용 중임을 의미하기 때문에 최대 절전 모드 이벤트 시스템을 이용할 수 있습니다 (here 섹션 14.2 참조). 시스템의 크기/복잡성에 따라 여기에 포인트 계산을 플러그인 할 수 있습니다 (크고 복잡한 시스템이 아닌 경우). 또는 소프트웨어가 청취하는 모든 내용에 따라 자신의 이벤트를 게시 할 수 있습니다.

디자인 방식 중 어느 점도 포인트 계산에 대해 알고 있거나 신경 쓰지 않는 것입니다. 내가 추측하고있는 것처럼, 꽤 일반적인 목적 플러그인 메커니즘을 만들려고한다면,이 타이 - 인 포인트에서 그 시스템에 당신의 이벤트를 퍼블리시합니다. 그런 다음 주어진 설치/설정에 플러그인이없는 경우 아무도 이벤트를 가져 오거나 처리하지 않습니다. 다른 설치/설정에 여러 플러그인이있는 경우, 각 플러그인은 수신 된 이벤트를 기반으로 수행해야 할 처리를 결정할 수 있습니다. "points plugin"의 경우 점 값을 계산하여 저장합니다. 저장된 프로 시저가 필요하지 않습니다 ....

1

두 가지 방법이 있습니다. 변경된 데이터에 대해 데이터베이스를 폴링한다는 것은 이미 알고 있습니다. 이 경우 데이터베이스가 변경되지 않고 프로세스가 느려질 수있는 경우 데이터베이스에 도달하게됩니다.

두 번째 방법 - 데이터베이스에서 변경이 발생할 때마다 데이터베이스에서 이벤트를 발생시킵니다. CDC (Change Data Capture)를 사용할 수 있습니다. 오버 헤드를 최소화합니다.

더 많은 옵션을 찾을 수 있습니다. Spring Integration

관련 문제