2016-06-10 2 views
1

사용자가 여러 종류의 보고서를 작성하고 읽고 업데이트하는 Rails 3.2 응용 프로그램에서 작업하고 있습니다. 우리는 MySQL과 Redis를 사용합니다.X에서 레코드가 업데이트되지 않은 경우 사용자에게 알립니다.

지난 x 개월 동안 사용자의 보고서 중 하나가 브라우저의 프로필/대시 보드 페이지에 알림을 표시하여 업데이트되지 않은 경우 사용자에게 알리고 싶습니다.

이 작업을 비동기 적으로 수행하는 것이 좋습니다.

언제든지보고있는 보고서가 업데이트되거나 다른 사람이 보고서를 좋아할 때 사용자에게 알림을 보낼 수있는 인앱 알림을 받고 싶습니다. 개념적으로, 나는이 일에 대해가는 가장 좋은 방법은 ... 고민했다

  1. SQL 쿼리를 실행, 3 개월 이상 필드 update_at있는 모든 보고서를 검색하고 연결 알림 기록을 생성하는 크론 작업 해당 사용자 및 보고서. 새 알림 레코드는 사용자에게 기존 알림이없는 경우에만 만들어집니다.

  2. 하루 종일 정기적으로 데이터베이스를 검사하는 Resque와 같은 것을 사용하는 백그라운드 작업입니다. 알림은 대기열에 저장됩니다. 이는보다 강력한 인앱 알림 기능으로 확장되는 것처럼 보입니다.

내 유일한 두 가지 옵션이 있습니까? 데이터베이스를 청취하는 더 나은 비동기 방식이 있으며 사용자가 자신의 레코드 중 하나가 3 개월 이내에 업데이트되지 않은 경우 사용자에게 알릴 수 있습니까? 여기에 웹 소켓 구현이 필요합니까?

답변

0

항상 항상 실행중인 백그라운드 작업에서 CPU주기를 사용해야 할 필요는 없지만 이러한 통지가 얼마나 강력한 지에 따라 달라집니다. 실시간 이길 원한다면 앞으로 게시자 - 구독자 모델을 사용할 계획입니다. consider a redis + node server setup.

웹 소켓이 복잡해지면 구현 시간이 늘어납니다. 그 여분의 시간이 정말로 당신에게 유익할까요? 채팅 앱에서 메시지를 교환하거나 Facebook에서 팝업 알림을받는 것처럼 비공개 및 실시간 알림이 중요 할 경우 이는 올바른 선택입니다.

그러나 실제로 원하는 것은 보고서가 특정 연령을 넘었을 때 사용자에게 알려주고 프로필 페이지를 요청할 때마다 2 시간마다 실행되는 cron을 훨씬 쉽게 구현할 수 있습니다. Google 애널리틱스를 사용하여 사용자가 앱에 가장 큰 부담을 느끼고 그에 대한 작업 일정을 잡을 수 있습니다.

먼저 위에서 설명한 동작을 완료하는 레이크 작업을 만듭니다. 이전 보고서를 확인하고 알림을 만듭니다. 앱의 lib/tasks 디렉토리에 저장합니다. 그리고 cron 작업과 같이 쓰기 :

$ 0 6,12,18 * * * cd /path/to/app && bundle exec rake task_name

이 작업을 오전 6, 정오와 오후 6시, 하루에 3 배를 실행합니다.

사용자의 활동 피드를 만들려면 동기식 펍 서브 솔루션을 매우 간단하게 구현할 수 있습니다. 예를 들어 사용자 A는 사용자 B의 보고서를 구독하고 사용자 B는 새로운 보고서 인 after_save 콜백을 게시하여 사용자 A에 대한 알림을 생성합니다.이 작업은 느려지 며 게시되지는 않지만 작은 응용 프로그램 인 경우이 기능은 ' 핵심 부분 인 경우 다른 옵션보다 시간을 더 효율적으로 활용할 수 있습니다.

관련 문제