Pergi versus Excel di ratusan ribu baris

Tahun ini kami sudah menulis di Habré tentang proyek kami SmartCalls.io - desainer panggilan visual yang dibuat untuk pengguna bisnis. Proyek ini memecahkan masalah bisnis panggilan pelanggan massal: skrip panggilan visual dibuat, file Excel dengan nomor telepon dimuat, dan kemudian kampanye panggilan dibuat. Kampanye diluncurkan - panggilan ke pelanggan dimulai; kapan saja Anda dapat menonton statistik, menjeda kampanye, mengubah pengaturan. Pelanggan puas sampai menjadi jelas bahwa kadang-kadang perlu untuk menelepon tidak hanya banyak orang, tetapi SANGAT, SANGAT banyak. Di bawah potongan adalah inti dari masalah dan bagaimana kita mengalahkannya menggunakan bahasa pemrograman HYIP (tidak masuk akal).


Masalah


Awalnya, pemrosesan file diimplementasikan dalam PHP 7.1 - itu adalah pilihan yang jelas, karena seluruh API SmartCalls ditulis di atasnya. Bekerja dengan daftar panggilan memiliki satu batasan - file tidak boleh mengandung lebih dari 10 ribu baris yang diisi. Keterbatasan ini sejak awal di SmartCalls dan, bagaimanapun, tidak kritis. Sampai titik tertentu.

Satu bank besar memiliki kebutuhan untuk kampanye menelepon yang sangat besar: diperlukan lebih dari 10 ribu pengguna. Tentu saja, tidak ada yang mencegah memecah file besar menjadi beberapa yang kecil dan mengunduhnya satu per satu, tetapi membuat klien menderita seperti ini bukan metode kami. Berbicara tentang unduhan alternatif - jika klien kami telah meluncurkan kampanye panggilan dan tiba-tiba ingin menambahkan pengguna ke dalamnya, maka ia dapat dengan mudah melakukannya. Ini sangat nyaman karena Anda tidak perlu berhenti menelepon atau menjalankan kampanye terpisah untuk pengguna baru. Tetapi Anda harus memahami bahwa kemungkinan memuat ulang tidak dipahami sebagai cara untuk memuat file besar secara manual, dalam beberapa bagian.

Jadi, tim memiliki tugas - untuk mengimplementasikan unggahan file besar dalam kampanye untuk menelepon.

Solusi


Kami sangat kompeten dalam pengembangan Java - misalnya, sebagian Voximplant API diimplementasikan dalam bahasa ini; kami juga mahir dalam PHP (lihat contoh di atas - Kapten Evidence menyarankan). Artinya, kami dapat dengan cepat menutup tugas ini menggunakan salah satu dari bahasa ini, tetapi kami berpikir untuk waktu yang lama untuk memperluas tumpukan teknologi kami, dan di sini kami mengingatnya dengan sangat baik: ini cukup cepat (bekerja dengan baik dengan memori), multi-threaded dan tidak perlu runtime karena Pergi mengkompilasi ke dalam biner yang dapat dieksekusi. Selain itu, kita dapat mengatakan tentang ukuran wadah, tetapi lebih lanjut tentang itu nanti ...

Sebagai hasilnya, kami menulis microservice dalam bahasa Go, yang menerima lembaran ukuran besar (diuji hingga 300 ribu baris) dan format (xls, xlsx dan semua variasinya). Sekarang saatnya untuk perincian.

Implementasi


Ketika klien mengunggah file> 10 ribu baris ke kampanye SmartCalls, layanan mikro akan diambil untuk itu. Dibutuhkan input pointer:

  • ke file yang diunduh ke penyimpanan S3;
  • ke kampanye di mana file ini perlu diunggah.

Kemudian microservice menjalankan file, klik dalam potongan 10 ribu baris (maksimum untuk platform) dan memuat setiap potongan sebagai file csv ke dalam penyimpanan S3, membuat catatan dalam database tentang setiap potongan (path ke file, jumlah baris). Setiap potongan diproses dan dimuat dalam aliran terpisah, yang memberikan peningkatan tambahan dalam kecepatan eksekusi.

Untuk membaca file Excel digunakan pustaka sumber terbuka dari tealeg dan extrame . Ini bagus karena mereka tidak hanya memiliki banyak bintang, tetapi juga komitmen baru :)

import ( "github.com/tealeg/xlsx" "github.com/extrame/xls" //   ) 

Dan semuanya akan baik-baik saja, tetapi tidak tanpa nuansa. Selama pengembangan, ternyata xlsx dan xls, dibuat di editor yang berbeda, sangat berbeda dalam format dan aturan untuk bekerja dengannya. Saya harus melakukan banyak tes - OpenOffice, Excel dari berbagai versi, LibreOffice, Google Sheets, untuk mengajarkan layanan microser untuk membawa file ke bentuk tunggal - CSV. Setelah microservice "mengunyah" file besar dan mengubahnya menjadi CSV, SmartCalls API dihidupkan dan sudah berfungsi dengan file csv ini. Untuk layanan mikro, kami meninggalkan batas 300 ribu garis, karena sangat memenuhi kebutuhan pelanggan, dan kami tidak menemukan kebutuhan yang lebih besar.

Hasilnya, implementasi menunjukkan hasil yang sangat baik dalam tes dan preprod, setelah itu kami meluncurkannya ke dalam prod.

Kesimpulan


Tim kami selalu berusaha untuk meluncurkan fitur / peningkatan baru dengan cepat, karena kami ingin pelanggan yang puas tetap seperti itu. Tugas dengan file besar bukan hanya tantangan bagi kami, tetapi juga alasan yang bagus untuk memperkenalkan Go ke dalam proyek, yang telah lama kami lihat. Selain perkembangan yang cepat dan kecepatan kerja, Go memberi kita dasar untuk masa depan ketika kita mulai memperkenalkan wadah (untuk membuat pembaruan tanpa batas dan hanya itu saja), yang bahasa ini sangat ringan. Kami akan menulis tentang kontainer secara terpisah, tetap disini :)

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


All Articles