0

興味深い難問。これが私がやりたいことです:

Herokuで実行されているPyramid(python 2.7.2)Webサイトがあり、iPhoneアプリユーザーに通知をプッシュします。毎日、すべてのユーザーは、午前10時から午後10時までのランダムに生成された時間にプッシュ通知を送信する必要があります(明らかにユーザーのタイムゾーンも知っている必要があります)。

私の現在の計画は次のとおりです。永続ワーカープロセスを使用して、1分ごとに1分ごとに関数をトリガーします。毎分、2つのことを行う関数(タイマーを中断しないように別のスレッドで)を呼び出します。

  1. 各タイムゾーンで午後11時かどうかを確認します(これは1日24回、各タイムゾーンで1回発生します)。trueの場合、それぞれのタイムゾーンですべてのユーザーをループし、翌日のランダムな時間を生成する関数を呼び出し、それをMongoデータベースに保存します。

  2. 毎分、ワーカーはユーザーをループし、その時点で通知の期限があるかどうかを確認します。期限が来ている場合は、通知を送信します。

私の質問は次のとおりです。事前に毎日ランダムな日時の膨大なリストを生成する必要がない、これを行うためのより良い方法はありますか?

4

2 に答える 2

0

ここにいくつかの擬似コードがあります:

Once per PERIOD (e.g. 1 minute) in the RANGE:
    Let NOTECOUNT be the number of users needing notification
    Let FRACTION be the length of the RANGE divided by the PERIOD
    Notify FRACTION of users (either first N or randomly chosen)
    Update notified user records with the notification time

At the end of each RANGE:
    Notify all users whose last notification time is at least 24 hours ago

複数のタイムゾーンを処理する方法については、明確に何もありません。サポートされている各タイムゾーンで上記のプロセスの「インスタンス」が1つ必要であると単純に考えると、各タイムゾーンのユーザーのリストが各インスタンスの候補リストになります。2つの潜在的な問題は、ユーザーがタイムゾーンを変更する可能性があることと、タイムゾーンが悪くなる可能性があることです。そのため、2回発生する場合があります(たとえば、DSTが変更された場合)。そのため、それについて考える必要があります。

于 2012-04-30T11:34:00.283 に答える
0

確かに他の方法があります。彼らが優れているかどうかは別の問題です。たとえば、特定のユーザーの1日の終わりまでにn分残っていて、まだ通知を受け取っていないとします。次に、確率1/ nで今すぐ通知を送信します。このように、ランダムな日時の膨大なリストは必要ありませんが、毎分、すべてのユーザーを繰り返し処理し、ユーザーがまだ通知されているかどうかを確認し、すべてのユーザーの乱数を計算する必要があります。これは、合計でもう少し計算量が多く(違いが重要であるとは思えませんが)、すべてのデータベース更新が小さいことを意味します。

または:ユーザーに通知するたびに、次の更新時刻を生成します。このように、次の更新時間は増分的に計算されますが、それでも事前にわかっています。

(ユーザー数が比較的少なく、ほとんどの分に通知がない場合は、スケジュールをよりスマートにすることができますが、ユーザー数が少ない場合はその量については詳しく説明しません。ソフトウェアが実行する必要のある作業は、とにかく無視できる程度であり、その場合に最適化する意味はありません。)

于 2012-04-30T11:36:15.183 に答える