2014-12-14 4 views
1

나는 일괄 처리 (일괄 처리 서비스는 여기에, API는 구동) 전용 웹 응용 프로그램을 가지고 있고 다른 모든 것에 전념하는 주요 웹 응용 프로그램이 있습니다. 나는 최선의 방법이 배치 서비스에서 비즈니스 로직의 중복을 피하는 것이 무엇인지 결정하는 데 어려움을 겪고있다. 두 응용 프로그램 모두 클러스터됩니다. 일괄 처리를위한 분리는 단순한 작업에서는 괜찮 았지만 비즈니스 논리가 복제되면 혼란을 야기 할 수있는 복잡한 작업이 있습니다. 이 질문의 목적을위한 나의 유스 케이스가있다.일괄 처리시 비즈니스 로직의 중복을 방지하려면 어떻게해야합니까?

  1. 고객은 사용자 업데이트를 위해 cron 작업을 예약합니다.
  2. 배치 서비스에는 20,000 개의 사용자 레코드가있는 CSV 파일이 제공됩니다.
  3. 배치 서비스는 레코드에 대한 유효성 검사를 수행하는 파일을 통해 추출합니다 (기본적으로 드라이 런).
  4. 일괄 처리 서비스는 허용되는 변경 및 오류 임계 값 (백분율은 개수)을 확인합니다.
  5. 유효성 검사 임계 값이 통과되면 일괄 처리 서비스가 사용자 생성/업데이트를 시작합니다.
  6. 사용자가 생성되거나 업데이트되면 이러한 이벤트에 대해 알아야 할 많은 모듈/기능이 있습니다.
  7. 작업 진행률이 추적되고 고객이 진행률, 로그 및 작업 상태를 볼 수 있습니다. 여기

내가 생각 한 몇 가지 솔루션입니다 :

  • 항아리 최대 비즈니스 로직 두 응용 프로그램에서 공유 할 수 있습니다. 주요 응용 프로그램이 Grails 응용 프로그램이고 전체적으로 GORM이 흩어져 있기 때문에 이것은 반드시 쉬운 일은 아닙니다.
  • 만들기 및 업데이트 및 더 복잡한 유효성 검사 시나리오에 대해 주 응용 프로그램에서 배치 서비스 히트 API를 가져 오십시오. 이것은 통풍구에 대해 걱정할 것이지만, 호출은로드 밸런서를 거쳐 배포되므로 배포 될 것입니다.
  • 유효성 검사를 위해 주 응용 프로그램에서 배치 서비스에 API를 적용한 다음 작성/업데이트 요청을 대기시키고 주 응용 프로그램에서 요청을 검색하도록하십시오. 위와 동일하게 대기열은 http 호출을 줄이는 데 도움이됩니다. 또한 일괄 처리 서비스로 상태를보고하는 대기열이 필요합니다.
  • 일부 로직을 배치 서비스로 복제하면 자체 유효성 검사 및 삽입/업데이트를 수행하지만 사용자가 만든 이벤트 또는 사용자 업데이트 이벤트를 발생시켜 주 앱의 모듈/기능이 변경 사항을 처리 할 수 ​​있습니다.
  • 삽입 기본 응용 프로그램으로 일괄 처리 서비스는

기타 자세한 사항 :

배치 서비스 및 웹 응용 프로그램은 모두 모두 AWS에서 실행되는
  • 클러스터, 그래서 나는 같은 도구를 가지고
    • SQS 및 SNS에 쉽게 액세스 할 수 있습니다.
    • Java 1.그것의 핵심에게 기반으로 비즈니스 로직의 중복을 피하기

    그래서 제 질문이 허용됩니다 어떤 방법을의에서 7 개 애플리케이션

  • 톰캣 컨테이너
  • 기본 응용 프로그램이 Grails의이다는
  • 배치 서비스는 스프링 배치 및 석영을 사용합니다 위의 세부 사항? 아키텍처를 더 잘 수용 할 수 있도록 변경해야합니까?

    또 다른 아이디어는이 모양과 "마이크로 서비스"아키텍처입니다. 그 말은 사무실에서 여러 번 던져졌고 우리는 주요 웹 애플리케이션을 서비스로 분해 할 생각을하고있었습니다. 예를 들어 사용자 관리를위한 서비스가 종료 될 수 있습니다.

  • 답변

    0

    예를 들어 Java EE 6 응용 프로그램을 사용한다고 가정 해보십시오.

    CSV 일괄 업데이트 프로그램은 매번 한 번씩 폴더에 덤프 된 CSV 파일을 읽고 그 파일에 인코딩 된 각 사용자 업데이트에 대해 원하는 업데이트를 인코딩하는 대기열로 메시지를 보내는 타이머 일 수 있습니다. 해야 할 것.

    다른 곳에서는 업데이트 요청 메시지에 반응하고 JMS 메시지에보고 된 사용자에 대한 업데이트 비즈니스 로직을 트리거하는 메시지 구동 Bean이 있습니다.

    트랜잭션이 성공적으로 커밋 된 후 사용자가 업데이트되었음을 ​​알기를 원하는 10 개의 다른 응용 프로그램이있는 경우 예를 들어 - say - messageType = 'userUpdated'와 함께 알림 항목에 메시지를 게시 할 수 있습니다. . 이 항목에 관심이있는 10 가지 응용 프로그램은 모두이 항목의 소비자 일 수 있습니다. 사용자가 업데이트되어 내부적으로 로컬 이벤트 (예 : CDI 이벤트 - 구아바 이벤트 - 무엇이든지 - 내부 사냥꾼이 현재 진행할 예정)를 게시했음을 알립니다.

    일반적으로 모든 technlogy 스택에는 항상 Java EE 대체본이 있습니다. 모든 적절한 기술 스택은 UI와 비즈니스 로직 간의 느슨한 결합을 촉진하는 방법을 제공하므로 HTML/WEB를 애플리케이션의 비즈니스 로직에 대한 많은 진입 점 중 하나로 간주합니다.

    스칼라에는 아주 흥미로운 AKKA 프레임 워크가 있습니다.

    귀하의 비즈니스 로직이 웹 응용 프로그램 만 사용할 수있는 장소에 작성되어 있지 않은 한 귀하의 벌금입니다. 그렇지 않으면 비즈니스 로직을 UI와 결합하도록 디자인 결정을 내 렸습니다.

    +0

    감사합니다. 파일을 완전히 실행하고 작업 진행 상황을 추적하고 고객이 작업 기록 및 로그를 볼 수 있도록해야한다는 사실을 명확히하기 위해 사례를 업데이트했습니다. 어떻게 처리할까요? –

    +0

    같은 방식입니다. 일괄 작업 응용 프로그램이 실행 중이고 일괄 처리 응용 프로그램의 액세스 가능한 위치에 로그를 쓰고 있습니다. 파일이나 appropraite DB를 말하십시오.이 작업을 수행하는 경우 웹 응용 프로그램에 긴 폴링 (혜성) 수신기가 연결된 패널이있을 수 있습니다.이 수신기는 로그 테이블을 정보로 터치하면 UI 업데이트로 돌아옵니다. 여기 메시지 버스가 DB가 될 것입니다. 또는 원하는 경우 CSV에서 업데이트가있는 서버로 메시지를 향상 시키면 userId = 5, remaining = 50 업데이트와 같은 수를 늘릴 수 있습니다. Blogic 업데이트 및 알림 왼쪽 50Left에 넣습니다. – 99Sono

    +0

    알림 항목에서 웹 응용 프로그램을 읽을 때 : CSV 작업의 사용자가 50 명 남았을 때 progress = 50 users remaining이라는 Application Scoped Bean의 상태를 업데이트합니다. 당신의 UI는이 정보를 perdiotically, 또는 당신이 혜성을 사용하는 경우 업데이 트가있을 때 imdiately 폴링했다. – 99Sono

    0

    귀하의 경우에는 서비스를 처리하는 다른 플러그인 인 Grails를 사용하는 경우에만 도메인 클래스를 수집하는 플러그인이라는 의미로 분리하여 제안하는 것이 좋습니다. 나는 당신의 어플리케이션이 너무 많은 KLOC를 포함하고 있다면, 모듈들 사이에 많은 호출이 있다면 마이크로 서비스를 사용하는 것이 너무 많은 시간을 필요로 할 것이므로 이렇게하면 훨씬 쉽다고 생각합니다.

    기능 모듈 간 통신. 플러그인은 이벤트를 통해 만들 수 있습니다. events-si 또는 rabbit MQ 플러그인을 참조하십시오.

    관련 문제