2017-12-08 11 views
0

Cassandra와 Lagom으로 첫 번째 Entity를 구성하려고합니다.Lagom persistentEntityRegistry.register가 작동하지 않습니다.

Lagom이 Cassandra에서 엔티티를 저장하는 방법에 대해 묻고 싶습니다. 실행하여 그래서

public class UserServiceImpl implements UserService { 

    private final PersistentEntityRegistry persistentEntityRegistry; 

    @Inject 
    public UserServiceImpl(PersistentEntityRegistry persistentEntityRegistry) { 
     this.persistentEntityRegistry = persistentEntityRegistry; 
     persistentEntityRegistry.register(UserEntity.class); 
    } 

    @Override 
    public ServiceCall<NotUsed, String> getUserInfo(String id) { 
     return (request) -> { 
      // Look up the user entity for the given ID. 
      PersistentEntityRef<UserCommand> ref = persistentEntityRegistry.refFor(UserEntity.class, id); 
      // Ask the entity the Hello command. 
      return ref.ask(new UserCommand.Hello(id, Optional.empty())); 
     }; 
    } 
} 

: 예를 들어

이 내 UserServiceImpl 클래스입니다

persistentEntityRegistry.register (UserEntity.class);

카산드라에 사용자 테이블을 추가해야합니까? 난 단지 때문에 :

내가 이해할 수없는

enter image description here

내가 내 Lagom 프로젝트를 시작하거나 우리가 이벤트 만 저장하기 전에 테이블 사용자를 생성해야합니까? 이 객체 관계 매핑 또는 유사한 것을 기반으로하지 있기 때문에

어떤 도움,

답변

2

Lagom는 엔티티 테이블을 필요로하지 않습니다 바랍니다. 지속성 계층은 Event Sourcing의 원칙을 기반으로합니다.

메시지 테이블에는 엔티티에서 방출 한 이벤트가 포함되어 있으며 메모리에 다시 가져올 때마다 상태가 복구됩니다.

기본적으로 이벤트는 json 형식으로 메시지 테이블에 저장됩니다.

또한 스냅 샷 개념이 있습니다. 엔티티 상태는 스냅 샷 (json을 사용하여)으로 저장 될 수 있습니다. 이것은 100 개의 이벤트가 끝날 때마다 발생하며 매번 처음부터 이벤트를 재생하지 않도록하는 작은 최적화입니다.

전체 메커니즘을 곧 설명하려고합니다.

명령이 엔티티로 보내지고 이벤트가 지속됩니다 (명령 처리기에서 발생 함). 이벤트가 지속되면 엔티티에 적용되어 이벤트 핸들러에서 발생하는 이벤트를 변경합니다.

서비스를 다시 시작하고 동일한 엔터티에 새 명령을 보냅니다. 이 시점에서 엔티티는 메모리에 없으므로 Lagom이 메모리로 가져 오지만 새로운 명령을 처리하기 전에이 엔티티에 대한 이벤트 기록을 재생하여 시스템이 다운되었을 때의 상태로 되돌릴 수 있습니다.

그런 다음 명령이 적용되고 새 이벤트가 지속됩니다.

엔티티의 스냅 샷이 저장되고 다음 번 엔 동일한 엔티티를 재생해야하는 경우 먼저 스냅 샷을로드 한 다음 스냅 샷 이후에 발생한 이벤트를 적용합니다. 따라서이 경우 전체 이벤트 기록을 재생할 필요가 없습니다.

+0

감사합니다. 레나토 씨와 늦게까지 죄송합니다. 나는 그것을 이해하고 있으며 지금은 더 분명하다. 그러나 동시에 영구적 인 읽기 측을 구현하여 엔티티를 조작 할 수 있습니다. 따라서 이벤트 소싱 및 CQRS가 권장되는 경우 언제 읽기 측을 사용해야합니까? 그것에 대해 어떤 권고가 있습니까? – Imen

+1

아이디어는 읽기 측에서 엔티티를 조작하지 않는 것입니다. 읽기 측은 이벤트에서 파생 될 수있는 모든 종류의 표현과보기를 생성하기위한 것입니다. – Renato

+0

OK 고맙습니다. :) – Imen