Google 애널리틱스와 비슷한 것을 만들고 있는데 현재는 실시간 데이터베이스 업데이트를하고 있습니다. 여기에 내 응용 프로그램에 대한 워크 플로 :데이터베이스 업데이트를 레일즈에 연기하려면 어떻게해야합니까?
- 사용자는
- I 데이터베이스에서 사용자의 요청 카운터를 기록 (JSON으로 반환,
- 나는 데이터베이스에 레코드를 찾을 편안한 API 요청을한다 즉 사용자가 2 API 호출을하면 사용자의 요청 카운터가 '2'만큼 증가합니다.
1 및 2는 SQL에서 실제로 빠릅니다. 이것은 SELECT입니다. # 3은 UPDATE이기 때문에 실제로 느립니다. 현실 세계에서 내 데이터베이스 (MySQL)는 확장되지 않습니다. New Relic에 따르면, # 3은 대부분의 시간이 소요됩니다 - 최대 70 %!
제 생각에는 동기식 DB 작업을 중단해야한다는 것입니다. 단기적으로는 DB 쓰기를 줄이기 위해 노력하고 있으므로 전역 컨트롤러에서 사용할 수있는 전역 해시 (예 : environment.rb에 선언되어 있습니다)와 모델에 쓰기를 대신 할 수있는 모델을 생각하고 있습니다. DB. 모든 경우에 DB에 기록해야하는 업데이트를 작성할 수 있습니다.
질문 :
- 이 소리 합리적인합니까? 어떤 문제가 있니?
- 동시성 문제가 발생합니까?
- 로그를 파일 시스템에 쓰고 나중에 가져 오는 것과 어떻게 비교할까요?
- 대신 Starling과 같은 메시지 대기열 시스템을 사용해야합니까? 어떤 추천?
PS : 여기서 문제가되는 쿼리 - 관심의 모든 열이 색인 :
UPDATE statistics_api
SET count_request
= COALESCE (count_request
?) +는? WHERE (id
=?)
링크를 업데이트 해 주셔서 감사합니다. ecoologic! –