אינטגרציה אמינה של 1C-Bitrix עם RabbitMQ

RabbitMQ לאינטגרציה אמינה של 1C-Bitrix ברגע שמתבצעת הזמנה, Bitrix מפעיל handler לאירוע כדי לשלוח נתונים ל-1C, CRM או מחסן. אם המערכת החיצונית לא זמינה, המשתמש רואה שגיאה וההזמנה אובדת. נאלצנו פעמים רבות לשחזר הזמנות כאלה ידנית. החלפה ישירה
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
אינטגרציה אמינה של 1C-Bitrix עם RabbitMQ
פשוט
~1 יום

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1466
  • פיתוח אתר לחברת FIXPER
    פיתוח אתר לחברת FIXPER
    1019
  • פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    פיתוח מבוסס Bitrix, Bitrix24, 1C לחברה פיתוח ווידג'ט להזמנת תורים אונליין למרכז רפואי
    764
  • פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    פיתוח על בסיס 1C Enterprise עבור MIRSANBEL
    882
  • פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    פיתוח אתר על CRM Bitrix24 עבור DOLBIMBY
    811
  • פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    פיתוח על בסיס Bitrix24 עבור חברת TECHNOTORGKOMPLEKS
    1167

RabbitMQ לאינטגרציה אמינה של 1C-Bitrix

ברגע שמתבצעת הזמנה, Bitrix מפעיל handler לאירוע כדי לשלוח נתונים ל-1C, CRM או למחסן. אם המערכת החיצונית לא זמינה, המשתמש רואה שגיאה וההזמנה אובדת. נאלצנו לשחזר הזמנות כאלה ידנית פעמים רבות.

העברה ישירה דרך HTTP או CommerceML חוסמת את ביצוע הסקריפט למשך משך הבקשה. בעומס של 5,000 הזמנות בשעה, חיבורים לא יציבים ל-1C גרמו לאובדן של עד 15% מההזמנות. לאחר הטמעת RabbitMQ עם Dead Letter Queue ולוגיקת ניסיונות חוזרים, האובדן ירד ל-0.1%. זמן העיבוד קוצר בעד 60% בזכות האסינכרוניות, וחיסכון שנתי בתחזוקה מגיע ל-$4.5k–6.5k.

הפתרון: RabbitMQ—Bitrix מפרסם הודעה לתור ואינו ממתין לתשובה. Worker ייעודי אוסף את ההודעה ומעביר אותה למערכת היעד, עם ניסיונות חוזרים במקרה של כשל. גישה זו מבטיחה מסירה ומונעת אובדן נתונים גם בזמן הפסקות זמניות.

למה RabbitMQ עדיף על אינטגרציות ישירות?

קריאת HTTP סינכרונית ישירה למערכת חיצונית חוסמת את ה-handler של Bitrix: המשתמש ממתין לתשובה, ובמקרה של שגיאה הנתונים אובדים לצמיתות. RabbitMQ הוא אסינכרוני—ההודעה נשמרת בתור ותעובד גם אם המערכת החיצונית לא זמינה זמנית. אמינות מסירה: החלפה סינכרונית מאבדת עד 5% מהאירועים, עם RabbitMQ—פחות מ-0.1%.

קריטריון החלפה סינכרונית RabbitMQ
אמינות תלויה בזמינות המערכת החיצונית מסירה מובטחת (ack, DLQ)—אמין פי 10
ביצועים חוסם את ה-handler עד לקבלת תשובה (עד 5 שניות) אסינכרוני, החזרה מיידית (< 1 אלפית השנייה)
מדרגיות מוגבל לקריאה אחת ניתן להרחיב Workers אופקית
טיפול בשגיאות שחזור ידני ניסיון חוזר אוטומטי

איך RabbitMQ פותר אובדן נתונים

עם החלפה סינכרונית, כשל במערכת החיצונית מוביל לאובדן אירועים. RabbitMQ שומר את ההודעה עד שה-worker מאשר את עיבודה (ack). אם worker קורס, ההודעה נשארת בתור ומעובדת על ידי תהליך אחר. Dead Letter Queue (DLQ) מבודד הודעות "בעייתיות" לבדיקה ידנית.

הודעות עם delivery_mode = 2 (Persistent) נשמרות לדיסק ומובטחת מסירתן גם לאחר הפעלה מחדש של ה-broker. לאמינות נוספת, אנו משתמשים ב-Publisher Confirms: היצרן מקבל אישור שה-broker קיבל את ההודעה. זהו נוהג סטנדרטי במערכות בעומס גבוה.

פרסום הודעות מ-Bitrix

כדי לעבוד עם RabbitMQ מ-PHP, השתמש בספריית php-amqplib. התקן דרך Composer ב-/local/: composer require php-amqplib/php-amqplib.

מחלקת Publisher:

use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; class RabbitMQPublisher { private static ?AMQPStreamConnection $connection = null; private static function getConnection(): AMQPStreamConnection { if (!self::$connection || !self::$connection->isConnected()) { self::$connection = new AMQPStreamConnection( COption::GetOptionString('site', 'rmq_host', 'localhost'), COption::GetOptionInt('site', 'rmq_port', 5672), COption::GetOptionString('site', 'rmq_user', 'guest'), COption::GetOptionString('site', 'rmq_pass', 'guest'), COption::GetOptionString('site', 'rmq_vhost', '/') ); } return self::$connection; } public static function publish(string $exchange, string $routingKey, array $payload): void { $channel = self::getConnection()->channel(); $channel->exchange_declare($exchange, 'topic', false, true, false); $msg = new AMQPMessage( json_encode($payload), ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT, 'content_type' => 'application/json'] ); $channel->basic_publish($msg, $exchange, $routingKey); $channel->close(); } } 

פרסום באירועי Bitrix

// В init.php AddEventHandler('sale', 'OnSaleOrderSaved', function($order) { if ($order->isNew()) { RabbitMQPublisher::publish('bitrix.events', 'order.created', [ 'order_id' => $order->getId(), 'user_id' => $order->getUserId(), 'total' => $order->getPrice(), 'timestamp' => time(), ]); } }); AddEventHandler('catalog', 'OnAfterIBlockElementAdd', function($fields) { RabbitMQPublisher::publish('bitrix.events', 'product.created', [ 'element_id' => $fields['ID'], 'iblock_id' => $fields['IBLOCK_ID'], 'name' => $fields['NAME'], ]); }); 

איך להגדיר Worker Consumer?

  1. התקן את ספריית php-amqplib דרך Composer.
  2. צור קובץ worker, לדוגמה use PhpAmqpLib\Connection\AMQPStreamConnection; use PhpAmqpLib\Message\AMQPMessage; class RabbitMQPublisher { private static ?AMQPStreamConnection $connection = null; private static function getConnection(): AMQPStreamConnection { if (!self::$connection || !self::$connection->isConnected()) { self::$connection = new AMQPStreamConnection( COption::GetOptionString('site', 'rmq_host', 'localhost'), COption::GetOptionInt('site', 'rmq_port', 5672), COption::GetOptionString('site', 'rmq_user', 'guest'), COption::GetOptionString('site', 'rmq_pass', 'guest'), COption::GetOptionString('site', 'rmq_vhost', '/') ); } return self::$connection; } public static function publish(string $exchange, string $routingKey, array $payload): void { $channel = self::getConnection()->channel(); $channel->exchange_declare($exchange, 'topic', false, true, false); $msg = new AMQPMessage( json_encode($payload), ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT, 'content_type' => 'application/json'] ); $channel->basic_publish($msg, $exchange, $routingKey); $channel->close(); } } :
// worker.php require '/local/vendor/autoload.php'; require $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'; $connection = new AMQPStreamConnection(/* параметры */); $channel = $connection->channel(); $channel->queue_declare('order.processor', false, true, false, false); $channel->queue_bind('order.processor', 'bitrix.events', 'order.created'); $channel->basic_qos(null, 5, null); $channel->basic_consume('order.processor', '', false, false, false, false, function($msg) { $data = json_decode($msg->getBody(), true); try { OrderSyncHandler::process($data); $msg->ack(); } catch (\Throwable $e) { $msg->nack(false, true); } } ); while ($channel->is_consuming()) { $channel->wait(); } 
  1. הגדר את Supervisor להפעלות מחדש אוטומטיות:
[program:bitrix_order_worker] command=php /var/www/bitrix.loc/local/workers/order_worker.php numprocs=3 autostart=true autorestart=true stderr_logfile=/var/log/supervisor/bitrix_worker.err.log 

Dead Letter Queue: טיפול בהודעות שלא עובדו

הודעות שנכשלות לאחר N ניסיונות מועברות ל-DLQ לבדיקה ידנית. הגדר בעת הצהרת התור:

$channel->queue_declare('order.processor', false, true, false, false, false, [ 'x-dead-letter-exchange' => ['S', 'bitrix.dlx'], 'x-dead-letter-routing-key' => ['S', 'order.failed'], 'x-message-ttl' => ['I', 3600000], // 1 час TTL ]); 

נטר את DLQ דרך ממשק הניהול של RabbitMQ (פורט 15672) או דרך התראות על גידול בתור. בפועל, DLQ מכיל פחות מ-0.5% מההודעות, מה שמאפשר זיהוי מהיר של שגיאות מערכתיות.

בעיות נפוצות ופתרונות

שגיאה השלכה פתרון
Worker ללא Supervisor לא מופעל מחדש בקריסה—התור גדל Supervisor עם autorestart
ללא הגדרת DLQ הודעות בעייתיות חוסמות את התור הגדר x-dead-letter-exchange
ללא ניטור גידול בתור לא מורגש Grafana + RabbitMQ Management
סוג exchange שגוי הודעות לא מנותבות השתמש ב-topic/direct לפי המשימה

מה כלול בהתקנת RabbitMQ עבור Bitrix?

אנו מספקים עבודה סוהר:

  • בדיקת החלפת הנתונים והארכיטקטורה הנוכחית.
  • תכנון סכמת תורים, exchanges ומפתחות ניתוב.
  • פריסת RabbitMQ (שרת או ענן), הגדרת קלאסטר.
  • הטמעת מחלקות publisher ו-workers לתרחישים שלך.
  • הגדרת Supervisor לניהול workers.
  • הגדרת DLQ וניטור (התראות, Management UI).
  • תיעוד סכמת ההחלפה והוראות למנהלים.
  • הדרכת הצוות שלך לעבודה עם תורים.

לוחות זמנים משוערים

תרחיש משך
פשוט (תור אחד, worker אחד) 1–2 ימים
בינוני (מספר תורים, DLQ, 2–3 מערכות) 5–10 ימים
מורכב (עומס גבוה, קלאסטר, consumers מותאמים) 2–4 שבועות

הניסיון שלנו

אנו עוסקים באינטגרציות Bitrix כבר למעלה מ-10 שנים. השלמנו 50+ פרויקטים עם RabbitMQ, כולל פינטק וקמעונאות. אנו משתמשים בתבניות מוכחות: אישור מסירה, DLQ, ניטור דרך Management UI והתראות. אנו מבטיחים החלפה אמינה ותמיכה בזמן.

צור קשר לבדיקת ארכיטקטורת ההחלפה שלך. קבל ייעוץ חינם. הזמן התקנת RabbitMQ ושכח מהזמנות אבודות.