Cek online di jaringan federal melalui RabbitMQ, 1C dan ilmu hitam


Tahun lalu, direktur TI dari salah satu perusahaan agro-industri terbesar di Rusia menghubungi kami. Pendekatan bisnis yang diterapkan oleh klien kami sangat mengesankan. Dia adalah salah satu yang pertama menerapkan gagasan perusahaan siklus penuh - dari lapangan ke rak di toko bahan makanan. Karena ketersediaan dan kualitas produk yang tinggi, holding ini telah menjadi merek yang diakui yang mereka kenal dan pilih. Pada saat itu, holding tersebut mencakup lebih dari 650 outlet dan lebih dari 20.000 karyawan yang didistribusikan di seluruh Federasi Rusia.


Pelanggan perlu memastikan pengiriman cek tercepat ke pusat dari semua outlet ritel di Rusia, termasuk warung makan di desa-desa terpencil dengan Internet sesekali dan komputerisasi yang minimal.


Dengan kekhususan ini, solusi untuk masalah tersebut berubah menjadi petualangan yang mengasyikkan dengan rebana, dukun, dan cakar kelinci di hadapan RabbitMQ. Bagaimana kami membangun kumpulan antrian dan apa yang kami temui - di bawah potongan.


Tentang masalah pelanggan


Bertahan dengan sejumlah besar outlet terdistribusi, beroperasi dalam kondisi persaingan yang ketat, menuntut agar para pemimpin mereka segera membuat keputusan manajemen. Untuk ini, manajer membutuhkan informasi tentang cek dalam mode real-time.


Dalam sistem saat ini, waktu pengiriman cek dari kasir ke sistem pusat mencapai 3 hari. Pada saat yang sama, informasi tentang pembelian sempurna tidak dicatat secara berkala (kehilangan cek).


Itu diperlukan untuk memberikan informasi tentang penjualan "di sini dan sekarang" untuk mengoptimalkan pengiriman produk ke outlet dan untuk merespon dengan cepat perubahan keseimbangan barang dan permintaan. Informasi ini harus secara bersamaan pergi ke IS pusat holding berdasarkan 1C dan ke komputer merchandiser di toko / outlet tertentu.


Selain itu, penting untuk memastikan revaluasi terpusat dan operasional barang melalui jaringan, serta menghubungkan ke sistem BI holding aliran data online dari semua outlet.
Sebagai hasilnya, kriteria untuk keberhasilan proyek dibentuk:


  • cek yang dilubangi di meja kas toko harus terlihat di sistem pusat 1C tidak lebih dari 1 detik dari saat "fiskalisasi" -nya di meja kas di hadapan (komunikasi) komunikasi;
  • dalam hal terjadi kegagalan komunikasi sementara, pastikan pengiriman cek dijamin cepat ke sistem pusat setelah pemulihan saluran komunikasi.

Untuk tim Silver Bullet, ini adalah hal yang sangat menggoda, karena pada saat itu kami telah mengembangkan adaptor 1C kami untuk RabbitMQ dan kemampuan untuk meluncurkannya ke pertempuran di jarak yang jauh dan banyak yang menarik pikiran para culun. Konsep โ€œposisi cek di pusat dalam 1 detikโ€ tidak begitu baru, pada tahun 2013 kami mempresentasikan ide untuk menggunakan antrian di 1C, dan bahkan mengujinya pada satu jaringan perdagangan, tetapi pada saat itu itu adalah kruk yang sangat eksperimental, yang termasuk, selain Kelinci +1 1C masih C #, WCF dan bahkan sedikit C ++.


Tentu saja, kami semua memata-matai buku pintar yang ditulis lebih awal. Oleh karena itu, saya tidak akan berani menghakimi ketika ide garis dalam proyek integrasi mulai mengambil alih dunia.


Dengan satu atau lain cara, bagian teoretis dan konsep arsitektur telah membuktikan keefektifannya, hanya ada sedikit hal yang tersisa - untuk melakukan semuanya, menguji, memperbaiki bug, mendokumentasikan, dan menyebarkan. : trollface:


Menyelam dengan kepala


Tidak ada yang tahu lebih baik dari pemilik bisnis tentang kekuatan dan kelemahannya, sehingga semua proyek integrasi dimulai dengan audit proses klien dan pemahaman tentang titik awal (SEBAGAIMANA ADANYA). Biasanya, survei bisnis meliputi:


  • analisis informasi tentang bagaimana proses bisnis berlangsung sekarang;
  • mengumpulkan persyaratan untuk sistem dengan mewawancarai karyawan kunci untuk memahami bagaimana, menurut pendapat mereka, proses bisnis harus diatur;
  • formalisasi dan optimalisasi proses bisnis.

Untuk menghilangkan perbedaan, kami menggunakan formalisasi proses bisnis AS IS dan TO BE dalam bentuk skema BPMN. Lebih mudah untuk memahaminya sendiri, dan lebih mudah bagi pelanggan untuk tidak melewatkan apa pun ketika kita melalui diagram proses bersama dengannya.


Dari fitur teknis, selama audit ditemukan bahwa:


  • outlet menggunakan mesin berbasis Windows - dengan sistem operasi heterogen diinstal (tergantung pada tahun pembuatan) dari Windows XP ke Windows 7, 8, 10;
  • register kas menjalankan firmware Frontol dengan Windows Embedded on board;
  • sirkuit manajemen ritel menggunakan perangkat lunak heterogen, termasuk solusi dari vendor 1C dan pengembangannya sendiri;
  • saluran komunikasi diimplementasikan pada prinsip "apa itu, yaitu," dalam rentang dari jalur kabel ke modem peluit USB;
  • gerai ritel dilayani oleh perusahaan outsourcing lokal dan bukan oleh layanan holding terpusat;
  • berfungsinya sistem secara substansial tergantung pada kemampuan servis (fungsi yang tepat) dari komputer manajer komoditas di setiap outlet.

Skema Integrasi AS-IS


Skema Integrasi AS-IS


Audit juga menunjukkan bahwa proses bisnis perusahaan secara praktis tidak perlu disesuaikan, tetapi perbaikan infrastruktur diperlukan untuk memastikan aliran informasi yang tidak terputus.


Secara umum, kami dihadapkan dengan tugas pengiriman dokumen yang andal antara tiga komponen proses: mesin kasir, pedagang komputer dan kantor pusat. Pada saat yang sama, komputer merchandiser adalah mesin "di bawah meja". Itu bisa dinyalakan / dimatikan atas permintaan merchandiser. Atau bahkan dimatikan 23 jam dari 24. Namun, ketika meninggalkan senja, pedagang harus melihat set harga, saldo, stok barang yang sebenarnya, dll.


Memilih solusi, mengumpulkan menyapu dan menempatkan kruk


Integrasi antrian telah lama menjadi pola umum. Saat Anda perlu mentransfer sesuatu di suatu tempat, dengan banyak tautan, di lingkungan yang tidak dapat diandalkan, dan merutekan aliran data pada saat yang sama, Anda memerlukan acara dan antrian. Oleh karena itu, kami memilih RabbitMQ, karena ia dengan mudah diintegrasikan ke dalam lingkungan (yang menurut kami), termasuk platform 1C, yang sudah kami miliki adaptornya sendiri untuk protokol AMQP.


RMQ adalah sejenis manajer aliran data dan memungkinkan integrasi dalam mode waktu "hampir nyata", sambil mempertahankan koneksi sistem yang lemah, menahan banyak beban, dan seterusnya dan seterusnya ... Server yang bagus, dengan kata lain, banyak yang telah ditulis tentang hal itu di Habrรฉ.


Salah satu fitur yang bagus adalah pengelompokan out-of-box dan kemampuan untuk membangun cluster server terdistribusi yang bekerja bersama.


gambar


Saya selalu menyukai gambar-gambar dengan arsitektur integrasi dalam antrian. Mereka selalu terdiri dari tiga dadu, di tengahnya adalah pialang pesan. Biarkan gambar seperti itu ada di artikel ini, agar tidak melanggar kanon.


Ketika membangun skema, muncul pertanyaan - di mana seharusnya server antrian berada? Dalam kondisi apa sistem kita berakhir? Kami menemukan bahwa ada 5 situasi darurat di mana pekerjaan tidak boleh berhenti.


  1. Semua blok disertakan.
  2. Pusat terputus, ada akses ke merchandiser.
  3. Merchandiser terputus, ada akses ke pusat.
  4. Dinonaktifkan dan merchandiser dan pusat.
  5. Sistem 1C dinonaktifkan.

Cek di semua situasi ini harus menerobos, perdagangan tidak boleh berhenti. Saat memulihkan saluran - cek harus sampai ke pelanggan. Biarkan saya mengingatkan Anda bahwa titik penjualan juga bisa menjadi kios pedesaan. Tidak ada server terpisah yang diinstal di mana RMQ dapat diinstal. Ternyata broker pesan harus langsung di kasir. Server adalah kemewahan yang tidak diizinkan, dan Rabbit cukup ringan dan dapat bekerja pada terminal POS kecil. Jadi mengapa tidak ya?


Tentu saja, kami tidak menjadikan POS satu-satunya simpul dari kluster RMQ, tetapi kami menempatkan salah satu node dari kluster gabungan langsung di terminal perdagangan, menjalankan Windows Embedded. Mengatakan ini agak lebih mudah daripada melakukannya, tetapi kami melakukannya dengan riang dan ceroboh. Apa yang akan saya katakan sekarang.


Bagaimana cara memasang RMQ terminal Frontol


Saya harus mengatakan bahwa Erlang dan server RMQ sendiri sampai ke terminal Windows hampir tanpa masalah. Masalah muncul di klien, yang harus berinteraksi dengan server dari perangkat lunak kasir.


Perangkat lunak mesin kasir Frontol memiliki dokumentasi yang cukup bagus, dan kami menemukan bahwa mungkin untuk menyesuaikan perilaku menggunakan Javascript. "Yuhu!" - kami katakan dan mulai google klien JS untuk RabbitMQ. Dengan cepat menjadi jelas bahwa gelandangan sedang menunggu kami. Di depan, tidak cukup Javascript. Baik i.e. secara formal, ya, sintaksnya sama di sana, tetapi mesin JavaScript itu sendiri dari Windows Script Host, yang sama yaitu VBScript, cscript.exe, dan banyak lagi. Singkatnya, ini sangat tua, spesifik microsoft, dan tidak ada klien JS waras tunggal yang akan bekerja di dalamnya.


Namun, dalam ekosistem WSH, Anda dapat menggunakan objek COM, dan kami menuju klien RMQ untuk .NET .


Versi modern dari klien ini tidak lagi mendukung. NET 3.5, yang tersedia untuk kita di terminal POS, tetapi untungnya, kode sumber klien terbuka, dan selain itu, github proyek mempertahankan tag di mana .NET 3.5 masih didukung. Kemuliaan bagi Sumber Terbuka! Tetap mengempiskan kode sumber dari versi lama klien .NET, centang kotak centang Com-Visible di sana dan gunakan untuk terminal.


Interaksi checkout Frontol


Perangkat lunak kasir memiliki API yang dapat digunakan untuk berinteraksi.


function init() { frontol.addEventListener("openDocument", "beforeOpenDocument", true); frontol.addEventListener("closeDocument", "beforeCloseDocument", true); frontol.addEventListener("closeDocument", "afterCloseDocument", false); frontol.addEventListener("closeSession", "beforeCloseSession", true); frontol.addEventListener("closeSession", "afterCloseSession", false); addPolyfills(); //   ) initRmqVariables(); createRMQConnection(); } 

Kemampuan JS asli yang ada di papan Windows sangat buruk. Misalnya, tidak ada Array.indexOf atau JSON.stringify. Tetapi dunia bukan tanpa orang baik. Kami ingat kruk berbasis browser populer yang disebut "polyphillas" dan dengan senang hati memasukkannya ke kasir. Mengesampingkan lelucon itu, semua trik sulap dengan JS sengaja dikomentari dengan cermat sehingga generasi admin masa depan dapat dengan jelas dan cepat memahami apa yang terjadi, dari mana asalnya dan bagaimana cara kerjanya.




Dengan cepat menjadi jelas bahwa JS-API tidak mencakup bagian dari kasus kami, namun, karena Frontol menyertakan DBMS Firebird, dan ada penyedia ODBC, kami dapat menggunakan Javascript untuk secara langsung menghubungi database kasir menggunakan Javascript dapatkan data yang kami butuhkan di sana.


 function afterCloseSession() { var connection = getDatabaseConnection(); var qSelect = new ActiveXObject("ADODB.Command"); qSelect.ActiveConnection = connection; qSelect.CommandText = "SELECT ChequeNumber " + "FROM Document " + "WHERE " + " State = 1 " + " AND(ChequeType IN(0, 1, 2)) " 

Dan akhirnya, bekerja langsung dengan server antrian dari JS kami terlihat seperti ini:


 function createRMQConnection() { factory = new ActiveXObject("RabbitMQ.Client.ConnectionFactory"); factory.UserName = rmqUser; factory.Password = rmqPass; factory.VirtualHost = "/"; factory.HostName = "localhost"; try { rmqConnection = factory.CreateConnection(0); } catch (e) { throw new Error("     .   !\n" + e.message); } rmqChannel = rmqConnection.CreateModel(); rmqMessageProperties = rmqChannel.CreateBasicProperties(); rmqMessageProperties.ContentType = "text/plain"; rmqMessageProperties.ContentEncoding = "string"; rmqMessageProperties.DeliveryMode = 2; } 

Gambaran keseluruhan dari solusi


Prinsip-prinsip berikut telah diletakkan dalam arsitektur:


  • Federasi server RabbitMQ - RMQ - Mode server Federasi sehingga acara dikirim ke semua penerima;
  • kelangsungan hidup meja kas lokal - jika suatu peristiwa terjadi di kasir, itu harus disampaikan dalam hal apa pun, bahkan jika saat ini meja kas tidak dapat diakses di jaringan;
  • 2 penyedia data - dalam mode normal, data dikirimkan melalui server (komputer merchandiser), jika komputer merchandiser tidak tersedia (sebagai akibat dari kecelakaan atau karena alasan lain), kasir mengirimkan pengiriman, ketika komputer merchandiser dihidupkan ia akan menerima bagian dari acara lebih lambat dari pusat, tetapi dijamin;
  • RMQ - server RabbitMQ layanan dengan port TCP terbuka untuk pengelompokan dan pengiriman pesan;
  • Untuk memastikan pengiriman pesan dijamin, redundansi aliran data diterapkan. Ini meminimalkan dampak koneksi jaringan antara node sistem;
  • di 1C: Pusat, diputuskan untuk menginstal satu set server RMQ dalam mode HA - ketersediaan tinggi dari server pusat, termasuk. Ada reservasi ganda dan replikasi acara, untuk menjamin pengiriman.


Sesuai dengan solusi arsitektur, diagram aliran data berikut ini dibuat:


  • Frontol, 1C - titik awal dan akhir pertukaran - objek yang merupakan sumber dan penerima pesan;
  • federated queue - jenis antrian khusus yang memungkinkan Anda untuk membuat sistem terdistribusi untuk mengirim pesan, di mana antrian tersebut dapat dipublikasikan di node yang terletak di outlet (hulu), dan penerimaannya dari antrian di tengah (hilir). Untuk pengiriman pesan dari hulu ke hilir, plug-in khusus (Federasi PlugIn) diinstal pada server antrian pusat;
  • Shovel - (secara harfiah "shovel") - mekanisme untuk mengirimkan pesan dari satu objek (antrian) ke objek lain. Objek dapat dimiliki oleh satu server atau berbeda;
  • arsitektur sistem menyediakan manajemen penyebaran jarak jauh, yaitu kemampuan untuk menginstal server RabbitMQ di komputer mana pun di jaringan induk dari satu pusat;
  • konfigurasi dan koneksi ke federasi dilakukan menggunakan skrip Post-Install yang disebut, yang datang standar dengan pengiriman server RMQ, dengan konfigurasi yang diperlukan dari parameter jaringan yang diterima di jaringan Pelanggan.

Sirkuit yang dihasilkan memberikan karakteristik kecepatan yang diurutkan dan bekerja secara stabil ketika salah satu komponen jatuh. Setelah koneksi terputus dan dipulihkan, data yang terakumulasi pergi ke pusat dalam 5-10 detik. Dalam praktiknya, teknologi sistem yang digabungkan secara longgar telah membuktikan keefektifannya. Semua peristiwa terjadi seolah-olah dalam satu kantor, tanpa memperhitungkan berbagai jenis keterlambatan yang terkait dengan distribusi teritorial dan berbagai tingkat ketersediaan saluran komunikasi yang melekat di dalamnya.


Kesimpulan singkat


Saya ingin secara terpisah menikmati waktu yang menakjubkan yang kami jalani. Baru-baru ini, penggunaan Open Source dalam suatu produk adalah semacam asketisme. "Apakah perangkat lunak open source Anda berfungsi?" Jadi, bagaimana Anda menyukai kaktus ini? โ€ Hari ini, ini adalah pepatah mutlak.


Saya tidak bisa membayangkan perusahaan yang tidak memiliki produk open source di dalam produk. Berkat ketersediaan informasi, perangkat lunak sumber terbuka, penerapan ide bisnis menjadi jauh lebih mudah dan lebih cepat. Perlu menaruh RMQ pada Javascript khusus kuno dan Windows? Tidak ada yang lebih mudah. Solusi googled agak tidak pantas? - lihat bagaimana ini dilakukan dan tambahkan yang hilang. Waktu-ke-Pasar ketika menggunakan produk terbuka berkurang secara signifikan. Dan semua orang tahu bahwa pelepasan solusi berarti keunggulan kompetitif.


Github, Stackoverflow, dokumentasi dan standar terbuka memungkinkan untuk diluncurkan dalam hitungan minggu apa yang sebelumnya membutuhkan keahlian bertahun-tahun dalam berbagai bidang pengetahuan komputer.


Dan tentu saja, sangat menyenangkan bahwa komunitas nama panggilan 1C keluar dari dunia tertutupnya setiap tahun dan bergabung ke dalam IT global. Misalnya, "1C: Enterprise" hari ini adalah salah satu bahasa resmi yang didukung oleh Github, dan orang-orang dari komunitas 1C "mengajarkan" itu ke bahasa ini. Cerita ini mungkin layak mendapat artikel terpisah, mungkin saya akan menulisnya suatu hari nanti. Sementara itu - semua yang terbaik dan semoga berhasil!


Terima kasih untuk waktu anda!

Source: https://habr.com/ru/post/id422151/


All Articles