Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

draw.io Diagram
bordertrue
viewerToolbartrue
fitWindowfalse
diagramNamewokersactor
simpleViewerfalse
width
diagramWidth613
revision2

...

라우팅 전략은 다양한 유입처리를 어떻게 분배하여 성능적 또는 안정적으로 유실없이 모두 처리할것인가?에

대한것으로 이러한것을  AKKA를 사용하여 서비스코드내에 직접 설계가 가능하도록합니다.

물론 이러한 목표를 달성하기위해 KAFKA와 같은 외부 MQ를 잘 사용하는것도 방법중에 하나일것입니다.


라우팅 방법 설정

Code Block
languagebash
themeEmacs
titleapplication.conf
akka { 
 actor.deployment {
 /workers/router1 {
 router = round-robin-pool
 nr-of-instances = 5
 }
 } 
}

코드의 변경없이 randomrandom-pool,balancing-pool 등 원하는 분배방식을 설정으로 통해 결정할수가 있습니다.설정을 통해 변경 할수가 있으며

라우팅기능이 추상화되어 사용가능함으로, 코드내에서 간단하게 활용가능합니다.

일반적으로 스레드풀관리를 직접 구현하여 라우팅기능을 구현하는것보다는 훨씬 쉬우며

외부 MQ시스템을 활용하는것보다는 번거러울수 있으나, 이러한 기능들을 직접 설계에반영하여

쉽게 내재화할수 있다란것은 장점중하나이며, 클러스터를 포함하여 라우팅기능에대핸 이해가 높아지기때문에

외부시스템과 연동하거나 이용할때도 도움이됩니다. 



라우팅기능을 포함한, 작업을 분배시키는 Wokers의 구현과 사용이 얼마나 심플해지는지 살펴보겠습니다.


Works구현

Code Block
languagejava
themeEmacs
@Component
@Scope("prototype")
public class Workers extends AbstractActor {
    private final LoggingAdapter log = Logging
            .getLogger(getContext().system(), "Workers");
    
    @Autowired
    private ApplicationContext context;    
    
    private ActorRef roundrobinpool = null;
        
    @Override public void preStart() {
		log.info("Workers::preStart");
		SpringExtension ext = context.getBean(SpringExtension.class);		


        //application.conf에 설정된 라우터방식으로 작동방식결정됨
		roundrobinpool = getContext().actorOf( FromConfig.getInstance().props( ext.props("testActor") ) , "router1");
	}
	
	@Override
	public Receive createReceive() {
		return receiveBuilder()
		.matchEquals("hi1",s->{  //hi1 메시지를 받으면 라운드로빈처리를함
			log.info("Workers::Received String message: {}", s);
			roundrobinpool.tell(s, getSender() );	// 입력된 잡(hi1)을 라운드 로빈라우터에게 메시지전송				
		})
		.matchAny(o -> log.info("received unknown message"))
		.build();
	}
}

...