Page History
Info | ||
---|---|---|
Future(미래)와 Promice(약속)은 비동기처리에 있어서 중요한 개념입니다. 미래에는 블록킹이 없기때문에 어느시점 사용가능 해지는 함수의 결과(성공또는 실패등을) 를 담을수 있는 용기라고 보면 됩니다. Scala에서는 이러한 기능을 위해 동일한 키워드를 지원하며 일반적으로 결과에대한 비동기적인 핸들이라고 이해하시면 되겠으며 C#/JAVA에서도 유사하게 활용이 가능합니다. 관련 참고 원문: 이러한 컨셉은 Java(8)/.net(4.5)의 경우 최신 버젼에서 지원하는것으로 보아 scala에서 영향을 준것으로 보입니다.
|
...
Info |
---|
퓨쳐는 여러함수의 결과가 다음 함수의 입력이되어야할시, 여러 함수가 병렬로 연결되며 나중에 여러 함수의 결과를 조합해야하는 파이프라이닝(pipelining)에 좋은 도구입니다. |
Future 활용사례(티켓서비스)
draw.io Diagram | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
var request = EventRequest(ticketNr) //요청을만든다 var response = EventResponse = callEventService(request) //응답이 완료될때까지 기다린다 var event:Event = reponse.event //최종 이벤트값을 읽는다. val trafficRequest = TrafficRequest{ destination = event.location, arrivalTime = event.time ) var trafficResponse = callTrafficService(trafficRequest ) //이벤트값을 가지고 다시 트래픽정보를 요청한다. |
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
var request = EventRequest(ticketNr) //요청을만든다 val futureRoute : Future[Route] = Future{ callEventService(request).event }.map{ event => val trafficRequest = TrafficRequest{ destination = event.location, arrivalTime = event.time ) callTrafficeService(trafficRequest).route //교통 루트를 반환한다. } |
Promice (미래를 위한 약속)
퓨쳐가 읽기전용 용기라고하면, 퓨쳐자체를 반환하는것을 작성하고 싶을때는 Promice를 사용하면 됩니다.
Promice는 퓨쳐에 비교하여 다음과 같은 특징을 가집니다.
- Promice는 미래를 위한 약속이기때문에 단한번만 완료될수있습니다.(다시 완료시 예외발생)
- Promice는 성공과 실패처리에대해 분리하여 처리할수 있습니다.
Promice 샘플 - KafkaSend
Code Block | ||||
---|---|---|---|---|
| ||||
def sendTokafka(recode: ProducerRecod): Futrure[RecordMetadata] = {
val promise : Promise[[RecordMetadata]] = Promise[RocordMetadata]() //RecordMetadata 타잎의 값을 돌려주는 약속을 만든다.
val future:Future[RecordMetadata] = promise.future //future에 대한 참조를 가져온다
val callback = new CallBack(){ //송신성공시 카프카 콜백
def onCompletition(metadata: RecordMetadata, e:Exception): Unit={
if(e != null ) promise.failure(e) //오류기록
else promise.success(metadata) //성공기록
}
}
producer.send(record,callback)
future
} |
퓨쳐를 조합하기
퓨쳐와 액터 조합하기
.net 에서 Actor 메시지와 Future(Task)를
...
조합한 샘플
Code Block | ||||
---|---|---|---|---|
| ||||
public class ReActor : ReceiveActor { private ILoggingAdapter log = Context.GetLogger(); public ReActor() { string myPath = Self.Path.ToString(); Receive<string>(message => { Handle(message); }); Receive<DelayReply>(message => { Handle(message); }); } public void Handle(string str) //InMessage { Task.Run(async () => { await Task.Delay(1000); //어떠한 값을 기다림 DelayReply reply = new DelayReply(); reply.message = str; return reply; }).PipeTo(Self); } public void Handle(DelayReply data) //Out { string logtrace = string.Format("I'am {0} RE:{1}", Self.Path, data.message); log.Info(data.message); Sender.Tell(data); } } |
...
이것은 로컬 로직을 확장할수 있는 방법중에 하나가 될것입니다.
...