2016-11-06 6 views
2

나는 하스켈을 처음 보았습니다. 무수한 튜토리얼과 기타 리소스를 읽었지만 원격으로 유용한 프로그램을 작성하려고 할 때마다 일반적으로 어디서부터 시작해야할지 모릅니다. 나는 최근에 Gabriel Gonzalez가 동기 부여를 유지하는 가장 좋은 방법이 실제로 프로젝트를 위해 그것을 사용하고 글을 쓰는 방법에 대해 이야기 한 podcast를 듣고 있었기 때문에 나는 현재 가지고있는 과제를 위해 그것을 사용하고 싶습니다.하스켈을 사용하여 한 데이터베이스에서 다른 데이터베이스로 어떻게 이동할 수 있습니까?

그래서 정기적으로 긁어 모으는 항목으로 업데이트되는 Mongo 데이터베이스와 Elasticsearch 데이터베이스가 있습니다. 전자는 이미 전에 긁은 적이있는 항목으로 자주 업데이트되며 후자는 고유 항목으로 채워집니다. 이것을 달성하기 위해 나는 끊임없이 Mongo 데이터베이스의 항목을 하나 하나씩 사용하고, Elasticsearch 데이터베이스에 이미 있는지 검사하고, 그렇지 않으면 추가합니다 (Node.js의 1000 줄) 스크립트를 가지고 있습니다 ; 이후 몽고에서 삭제됩니다. 이 스크립트는 그러나 총 엉망입니다.

하스켈은 내가 읽고들은 내용에서 제어 된 방식으로 IO를 관리하기에 훌륭하고, 데이터 변환을위한 순수한 기능을 유지하는 아이디어를 좋아하기 때문에 하스켈에서 이것을하고 싶었습니다. 실제로 IO를 수행하는 프로그램의 부분이 분리됩니다. 나는 또한 일하는 하스켈 (Haskell) 솔루션이 더 간결하고 추후에 상황을 변경할 때 추론하기 쉽다고 가정한다.

지금까지 mongoDB 패키지를 사용하여 튜토리얼을 따라 Mongo에서 CRUD 작업을 수행했지만 어떻게 작동하는지 아직도 이해할 수없는 많은 것들이 있습니다. 나는 Elasticsearch에서 같은 일을하는 것을 위해 bloodhound 패키지를 사용하는 것이 더 힘들다는 것을 알았고, 나는 성공적으로 추가 된 후에 관련 아이템이 Mongo에서만 삭제된다는 것을 보장하면서, 함께 물건을 어떻게 조립할 것인가에 대해서 완전히 곤란했다. Elasticsearch.

나는 이것이 매우 광범위한 질문이라는 것을 알고 있습니다. 그러나 누군가 이것에 대해 알고 있거나 단순히 어떤 방향으로 나에게 줄 수 있다면, 나는 그것을 감사 할 것입니다. 실제로, 모든 도움은 대단히 감사 할 것입니다.

+0

이 질문은 스택 오버플로 형식을 통해 유용한 방식으로 대답하기에는 너무 광범위합니다. 이 시점에서 달성해야 할 문제를 작은 자체 코드로 증류 한 다음 질문을 던지면 더 나은 결과를 얻을 수 있습니다. – duplode

답변

5

데이터 변환을위한 순수한 기능을 보존하고 실제로 IO를 수행하는 프로그램의 부분을 유지하는 아이디어를 좋아합니다.

하스켈로 시작하는 경우이 장치를 백 버너에두고 그냥 어디서나 IO이 있더라도 작동하는 솔루션을 구축하는 것이 좋습니다. 자신감을 얻으면서 코드를 재구성하는 방법을 배우게됩니다. 나는 완전히 내가 함께 일을 잇 것이다 방법으로 난처한 상황에 빠진거야

, 특히 관련 항목은 성공적으로 Elasticsearch에 추가 한 뒤, 몽고에서 삭제되도록한다는 잠시.

내가 somehting을 놓치지 않는 한, 그것은 꽤 간단한 프로그램 논리처럼 보입니다! 다음 (완전 발명, 조잡한 단순화) 한 경우

getDocumentFromMongo :: MongoGonnection -> IO Document 

deleteFromMongo :: MongoConnection -> Document -> IO() 

isPresentInElastic :: ElasticConnection -> Document -> IO Bool 

insertInElastic :: ElasticConnection -> Document -> IO() 

당신은 같은 무한 루프에 쓸 수 기능 : 물론

loader :: MongoConnection -> ElasticConnection -> IO r -- runs forever 
loader mongoConn elasticConn = forever (do 
    document <- getDocumentFromMongo mongoConn 
    existsInElastic <- isPresentInElastic elasticConn document 
    if existsInElastic 
     then return() 
     else insertInElastic elasticConn document 
    deleteFromMongo mongoConn document) 

을 고려 할 사항이 더 많습니다. Elastic Search에 삽입하는 동안 exception이 던져지면 어떻게해야합니까?아마도 try, bracket, finallyonException과 같은 기능을 Control.Exception에서 사용해야 할 것입니다.

또한 일부 수준의 동시성이 필요할 수 있습니다. 이 경우에도 manygoodlibraries이 있습니다.

+0

감사합니다. 훌륭한 답변입니다. 마지막으로 지적했듯이, Elasticsearch 업데이트를 업데이트 할 때해야 할 일은 내가 알아야 할 것 중 하나입니다. 저는 파이썬에서 왔습니다. 예외 처리는 파이썬에서 어떻게 이루어 졌는지와 비슷하게 들립니다. 나는 하스켈에서 그럴 것이라고 생각하지 않았습니다. 또한, 당신이 묘사하는 방식으로 영원히 그것을 실행할 때, 몽고 데이터베이스가 비어 있고 소비 할 것이 없을 때 대기하는 것을 어떻게 처리합니까? –

+0

@Nicholas Tidemann Haskell은 시그널링 오류에 대해 두 가지 종류가 있습니다 : 예외 및 'Either'또는 'Maybe'와 같은 합계 유형. http://book.realworldhaskell.org/read/error-handling.html 대기 중으로,'Control.Concurrent'에서'threadDelay :: Int -> IO()'를 사용하여 간단한 폴링 메커니즘을 구현할 수 있습니다. http://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Concurrent.html#v:threadDelay – danidiaz

+0

맞아요, 저는 적어도 "어느 쪽이든"과 "어쩌면"에 대해 잘 알고 있습니다. 그들에 대해 많이, 나는 그것을 밖으로 일할 수 있는지 보겠습니다. 기다리는 것에 관해서는,'threadDelay'가 파이썬에서'time.sleep'와 비슷하게 작동하는 선호되는 방법이기도합니다. 그러나 동시 적이기 때문에 약간 다르게 작동합니다. 어떤 진전을 일으킬 수 있는지 알게 될 것입니다. 도움을 주셔서 감사합니다. –

관련 문제