Отправка уведомлений 25k + пользователям, вызывающим проблемы на сервере - PullRequest
1 голос
/ 10 октября 2019

Сейчас в базе 25 000 пользователей. Все пользователи подписаны на общую тему All.
У меня есть две директории внутри public_html. Во-первых, для API, встроенного в codeigniter. Этот API используется для предоставления данных для всех устройств adnroid и iOS.
Второй каталог для админ-панели, встроенной в Laravel. Мы используем его для загрузки данных, а также для отправки уведомлений по темам Firebase.
И API, и панель администратора совместно используют одну и ту же базу данных.

Если мы отправляем уведомление по темам, на которые не подписано большое количество пользователей, проблем не возникает.
Но если я отправлю уведомление на тему, в которой много пользователей, это вызовет проблемы на нашем сервере.
API перестает отвечать, или иногда слишком долго реагирует.
Иногда также перестает отвечать и админ-панель.

Я так растерялся, потому что все вещи обрабатываютсяfirebase. Я просто делаю один вызов API.
Может кто-нибудь объяснить, что является причиной проблемы? Или любая возможная причина?
Обновление

use Kreait\Firebase\Messaging;
use Illuminate/Support/Http/Request;

trait UserTrait {

public function notify(Request $request, Messaging $messaging) {

        $message_hi = array(

            "notification_type" => $notification_type,

            "notification_title" => $notification_title_hi,

            "icon_image" => $icon_image,

            "notification_description" => $request->notificationText_hi,

            "image_url" => $request->image_url,

        );

        $message = array(

            "notification_type" => $notification_type,

            "notification_title" => $notification_title,

            "icon_image" => $icon_image,

            "notification_description" => $request->notificationText,

            "image_url" => $request->image_url,

        );
 $commodityIdArray = $request->cId

//to send all
if($request->notification_type == 1) {
 $messaging->sendAll([
                ['topic' => 'All', 'data' => $message],
                ['topic' => 'All_hi', 'data' => $message_hi],
            ]);
 } else {
   //to send to a fourite topic subscribed by some users
    //Prepare Condition for both hindi and english users
             $topic_condition = "";
             $topic_condition_hi = "";
             foreach($commodityIdArray as $topic) {
                 $topic_condition .="'".$topic."' in topics && ";
                 $topic_condition_hi.="'".$topic."_hi' in topics &&";

             }

            //send notification to hindi and english topics
             $messaging->sendAll([
                ['condition' => substr($topic_condition, 0, -3), 'data' => 
                    $message],
                ['condition' => substr($topic_condition_hi, 0, -3), 'data' => 
                    $message_hi],
                ]);


 }

}

1 Ответ

0 голосов
/ 10 октября 2019

Использовать очередь

Вы должны использовать очередь, которая устанавливает ваш процесс в очередь, и когда один процесс завершается, второй запускается

, вы также можете установить номерповторных попыток вашего процесса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...