2016-10-06 2 views
1

나는 카산드라의 DB에 대한 클라이언트를 사용하여 기꺼이, 그래서로 초기화 할 필요가 : 나는 두 길을 만든컨트롤러에서 상태를 유지 하시겠습니까?

client = CQEx.Client.new! 

, 읽고 쓸 수있는 컨트롤러 행동 포인트.

질문은 어떻게 클라이언트를 한 번만 초기화하고 컨트롤러의 동작에서 매번 사용합니까?

GenServer를 만들고 컨트롤러 작업에서 메시지를 보내겠습니까? 그래서 나는 GenServer 내에서 cassandra 클라이언트를 유지할 수 있습니까?

조치를 실행할 때마다 클라이언트를 만들 수 있습니까?!

여기에 어떤 조언이 있습니까?

+0

GenServer와 새 클라이언트는 매번 처리 할 동시 요청 수와 새 Cassandra 연결 생성 비용과 같은 필요에 따라 전적으로 좌우됩니다. Ecto처럼 poolboy를 사용하여 연결 풀을 조사하고 싶을 수도 있습니다 (https://github.com/elixir-ecto/db_connection 및 https://github.com/devinus/poolboy 참조). – Dogbert

+0

수천 개의 동시 요청을 처리해야합니다. 내 자체에 응답 한 것 같습니다. :) 왜 각 읽기 또는 쓰기 작업에 대해 '작업'을 만들지 않습니까? 그래서 각 작업은 별도의 프로세스에서 실행됩니다.이 작업을 수행하는 좋은 방법입니다 (GenServer를 사용하지 않기로 결정할 때마다 매번 연결 만들기). – simo

+1

왜 작업을 만드시겠습니까? 각 요청은 이미 새로운 프로세스가 될 것이고 다른 요청과 동시에 실행될 것입니다. 많은 양의 읽기/쓰기 작업을 수행하고 싶지 않다면 _per request_를 실행하십시오. 어쨌든, @tkowal은 옳은 것처럼 보입니다.'cqerl'은 이미 연결 풀을 만드는 것처럼 보이기 때문에'Client.new! '를 직접 호출 할 수 있습니다. – Dogbert

답변

1

좀 더 자세히 조사해야 하겠지만, CQEx.Client.new!은 실제로 클라이언트를 초기화하지 않아서 오해의 소지가 있습니다.

구현 https://github.com/matehat/cqex/blob/master/lib/cqex/client.ex#L7는 내부적으로 :cqerl.get_client()를 호출하는 것을 보여 주며 cqerl 도서관에서 살펴 경우 단지 get_client를 사용하여 작업을 수행하는 것이 동시성을 처리하는 데 필요한 안전하지 될 수 있도록, 그것은 연결 아 파크 감독을 생성합니다.

+0

아, 정말 .. 지적 해 주셔서 감사합니다 – simo

+0

라이브러리에 자체 감독 트리 및 작업자 프로세스가 있고 작업에서 하나 또는 두 개의 쿼리 만 수행하는 경우 이는 완전히 중복되어 실제 비즈니스 논리를 난처하게합니다. 'cqerl'은'pooler'에 의존하기 때문에 끊임없이 연결된 근로자 풀을 관리합니다. * 하나 * 컨트롤러 동작에서 많은 동시 쿼리를 수행하면 속도가 빨라질 수 있습니다. 당신은 그것을 측정해야합니다 :) – tkowal

+0

고마워, 실제로 그것은 각 요청마다 단 하나의 작업입니다. – simo

관련 문제