תארו לעצמכם: לקוח מבצע הזמנה בשווי 9–13 אלף דולר, אבל ההודעה אף פעם לא מגיעה—המנהל מפסיד את העסקה בגלל RabbitMQ תקוע. אנו בונים מערכות התראות מרובות ערוצים שמתמודדות עם עומסי שיא של 10,000 הודעות בדקה ומבטיחות אספקה של 99.9%. המשתמשים בוחרים את הערוצים שלהם: אימייל, SMS, Push, In-App. המשימות המרכזיות—אחסון הגדרות מרכזי, תור שליחת הודעות, הסרת כפילויות, וניסיון חוזר במקרה של כשל. במשך 5 שנים, פרסנו 50+ מערכות כאלה עבור פלטפורמות מסחר אלקטרוני ו-SaaS גדולות. מערכת ההתראות שלנו מתוכננת להיות מערכת התראות מרובת ערוצים חזקה שמבטיחה אספקה גם בעומס כבד.
בעיות שאנו פותרים
ללא תור, התראות הולכות לאיבוד בעומסי שיא: מסד הנתונים לא יכול להתמודד עם אלפי הכנסות, ממשקי API חיצוניים מחזירים שגיאות 503. אסימוני Push לא תקינים מצטברים—כל התראה לאסימון כזה מבזבזת תקציב. משתמשים מתלוננים על ספאם אם ההגדרות לא מאפשרות השבתת ערוץ. הארכיטקטורה שלנו פותרת את כל זה.
ארכיטקטורת תור: אספקה מובטחת
המערכת בנויה סביב תור (Redis או RabbitMQ). כל התראה היא משימת תור. אם השירות החיצוני לא זמין זמנית, המשימה מנסה שוב עם השהיה אקספוננציאלית. לאחר שלושה כשלים—היא עוברת לתור הודעות מתות (Dead Letter Queue) לבדיקה ידנית.
[Event: OrderShipped] ↓ [NotificationService]
├── Проверить настройки пользователя
├── Email: в очередь → SendGrid/Mailgun
├── SMS: в очередь → SMSC/Twilio
├── Push: в очередь → Firebase FCM
└── In-App: сохранить в БД → WebSocket push השוואת ערוצים: אימייל, SMS, Push, In-App
| ערוץ | זמן אספקה | אמינות | דורש הרשאה | הכי מתאים ל |
|---|---|---|---|---|
| אימייל | דקות | 95–99% | לא | הודעות ארוכות ומפורטות |
| SMS | שניות | 99% | כן | התראות קריטיות (2FA) |
| Push | שניות | 90–95% | כן | תזכורות מהירות |
| In-App | מיידי | 100% (בתוך האפליקציה) | לא | התראות בתוך האפליקציה |
התראות Push משיגות שיעורי פתיחה גבוהים פי 3 מאימייל, מה שהופך אותן לטובות יותר להתראות דחופות. לפי תיעוד Firebase, שיעורי אספקת התראות Push עולים על 90%. SMS מהיר פי 10 מאימייל להתראות קריטיות, אבל עולה יותר.
יישום ב-Laravel
class NotificationService {
public function notify(User $user, string $type, array $payload): void {
$prefs = NotificationPreference::where('user_id', $user->id)
->where('notification_type', $type)
->first();
$defaults = [
'email_enabled' => true,
'sms_enabled' => false,
'push_enabled' => true,
'inapp_enabled' => true,
];
$channels = array_merge($defaults, $prefs?->toArray() ?? []);
if ($channels['inapp_enabled']) {
$notification = Notification::create([
'user_id' => $user->id,
'type' => $type,
'title' => $payload['title'] ?? null,
'body' => $payload['body'] ?? null,
'data' => $payload['data'] ?? [],
]);
broadcast(new NewNotificationEvent($user, $notification))->toOthers();
}
if ($channels['email_enabled'] && isset($payload['email'])) {
SendEmailNotificationJob::dispatch($user, $type, $payload['email'])->onQueue('notifications');
}
if ($channels['sms_enabled'] && $user->phone && isset($payload['sms'])) {
SendSmsNotificationJob::dispatch($user, $payload['sms'])->onQueue('notifications');
}
if ($channels['push_enabled'] && isset($payload['push'])) {
SendPushNotificationJob::dispatch($user, $payload['push'])->onQueue('notifications');
}
}
} הגדרת ספקים
אימייל: תבניות וספקים
לאימייל אנו משתמשים ב-SendGrid (או Mailgun) עם תבניות Blade מוכנות. כל סוג התראה הוא מחלקת mailable נפרדת. חשוב להגדיר מעקב אחר פתיחות ולחיצות.
SMS: SMSC.ru ו-Twilio
לרוסיה—SMSC.ru, בקשת HTTP עם שם משתמש וסיסמה. לבינלאומי—Twilio. שניהם עטופים בתור עם ניסיונות חוזרים על שגיאות 500.
Push: Firebase FCM ו-Web Push
Firebase Cloud Messaging שולח התראות ל-Android, iOS ו-Web (דרך Service Worker). אנו מסירים אסימונים לא תקינים ממסד הנתונים לאחר תגובת FCM. ל-Web Push, אנו משתמשים במפתחות VAPID.
יישום בצד הלקוח: Web Push ומרכז התראות
Web Push: הרשמת Service Worker
async function subscribeToPush(): Promise<void> {
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(import.meta.env.VITE_VAPID_PUBLIC_KEY),
});
await api.post('/api/push-tokens', {
token: JSON.stringify(subscription),
platform: 'web',
});
} React: מרכז התראות בזמן אמת
function NotificationCenter() {
const { data, refetch } = useQuery({
queryKey: ['notifications'],
queryFn: fetchNotifications
});
const unread = data?.filter(n => !n.read_at).length ?? 0;
useEffect(() => {
const echo = window.Echo.private(`notifications.${currentUser.id}`)
.listen('NewNotificationEvent', () => refetch());
return () => echo.stopListening('NewNotificationEvent');
}, []);
return (
<div className="notification-center">
<button className="bell" aria-label={`Уведомления: ${unread} непрочитанных`}>
<BellIcon />
{unread > 0 && <span className="badge">{unread > 99 ? '99+' : unread}</span>}
</button>
<ul className="notification-list">
{data?.map(notification => (
<li key={notification.id} className={notification.read_at ? '' : 'unread'}>
<span>{notification.title}</span>
<time>{timeAgo(notification.created_at)}</time>
</li>
))}
</ul>
</div>
);
} הסכנה של שאילתות N+1 במערכות התראות
כשמביאים את רשימת ההתראות, אל תשאלו כל משתמש בנפרד—השתמשו בטעינה מוקדמת (eager loading). אנו בודקים את כל השאילתות דרך Laravel Debugbar ומבצעים אופטימיזציה של אינדקסים. זה מקטין את זמן התגובה של ה-API מ-2 שניות ל-50 אלפיות השנייה.
מדריך אינטגרציה שלב אחר שלב
- ניתוח דרישות: הגדירו סוגי התראות, ערוצים וקהל יעד.
- עיצוב סכמת מסד נתונים: צרו טבלאות להתראות, העדפות ואסימוני Push.
- יישום תור: הגדירו Redis או RabbitMQ וקבעו תצורה לתהליכי עובדים.
- אינטגרציית ספקים: חברו את SendGrid, Twilio, FCM ו-SMSC.ru עם טיפול נכון בשגיאות.
- בניית ממשק משתמש: פתחו דף הגדרות ומרכז התראות.
- בדיקה ופריסה: בצעו בדיקות עומס ופרסו עם ניטור.
תהליך היישום ולוחות זמנים
| שלב | מה אנחנו עושים | משך |
|---|---|---|
| ניתוח | תיאור סוגי התראות, בחירת ספקים, עיצוב סכמת DB | 1–2 ימים |
| עיצוב | הקמת תור, כתיבת שירות התראות, ממשק להגדרות | 2–3 ימים |
| יישום אימייל ו-SMS | אינטגרציה עם SendGrid/Mailgun ו-SMSC/Twilio, תבניות, טיפול בשגיאות | +2 ימים |
| Push (FCM + Web) | Service Worker, VAPID, טיפול באסימונים לא תקינים | +2 ימים |
| In-App + WebSocket | שמירה ל-DB, Push בזמן אמת דרך Laravel Echo | +2 ימים |
| בדיקות ופריסה | בדיקות עומס, ניטור, תיעוד | +1–2 ימים |
| מערכת מלאה | כל הערוצים, ממשק, תורים, ניסיונות חוזרים | 7–10 ימים |
מה כלול בתוצרים
- תיעוד מפורט של זרימות ההתראות
- גישה לפאנל ניהול עם ניהול משתמשים
- קוד עם הערות
- תמיכה חודש אחרי ההשקה
- הקמת ניטור ביצועים
- הבטחת SLA: 99.9% זמינות
לקוחות חוסכים בממוצע 12,000 דולר בשנה על ידי מניעת התראות שהוחמצו. עלות פרויקט טיפוסית נעה בין 5,000 ל-15,000 דולר תלוי בערוצים ובמורכבות.
מלכודות נפוצות ואיך להימנע מהן
- סדר תורים שגוי: אימייל ו-Push על אותו עובד—נפח אימייל גדול חוסם את ה-Push. פתרון: תורים ייעודיים. - חוסר הסרת כפילויות: לחיצה על "שלח" שוב גורמת לכפילויות. פתרון: בדיקה לפי hash של האירוע. - התעלמות ממגבלות קצב של ספקים: FCM מגביל 600,000 בקשות/שנייה, אבל מגבלת ה-SMS נמוכה יותר. הגדירו סמפור.איך להימנע מהתראות כפולות?
אנו משתמשים במזהה אירוע ייחודי (UUID). לפני השליחה, אנו בודקים אם האירוע כבר עובד. אם כן—מדלגים.
צרו קשר להערכת פרויקט—קבלו ייעוץ תוך יומיים. אנו מבטיחים SLA של 99.9% ומספקים מומחים מוסמכים.







