C ++ Edisi Perusahaan. Apakah mungkin?

C ++ Edisi Perusahaan


Apa itu "edisi perusahaan"


c ++ ee


Anehnya, selama ini saya bekerja di TI, saya tidak pernah mendengar ada yang mengatakan "edisi perusahaan" tentang bahasa pemrograman, kecuali untuk Java. Tetapi bagaimanapun juga, orang-orang menulis aplikasi untuk segmen korporat dalam banyak bahasa pemrograman, dan entitas yang dioperasikan oleh programmer, jika tidak identik, adalah serupa. Dan untuk c ++ khususnya, saya ingin mengisi celah kewirausahaan, setidaknya menceritakannya.


Sehubungan dengan C ++, "edisi perusahaan" adalah subset dari bahasa dan perpustakaan yang memungkinkan Anda untuk "dengan cepat" mengembangkan aplikasi [lintas-platform] untuk sistem modular yang digabungkan secara longgar dengan arsitektur cluster terdistribusi dan / atau cluster dan dengan logika bisnis terapan dan, sebagai aturannya, beban tinggi.


Untuk melanjutkan percakapan kita, pertama-tama, kita perlu memperkenalkan konsep aplikasi , modul , dan plug-in


  • Aplikasi adalah file yang dapat dieksekusi yang dapat beroperasi sebagai layanan sistem, memiliki konfigurasi sendiri, dapat menerima parameter input, dan dapat memiliki struktur plug-in modular.
  • Modul adalah implementasi antarmuka yang hidup di dalam aplikasi atau logika bisnis.
  • Plugin adalah perpustakaan yang dimuat secara dinamis yang mengimplementasikan satu atau lebih antarmuka, atau bagian dari logika bisnis.

Semua aplikasi, melakukan pekerjaan mereka yang unik, biasanya membutuhkan mekanisme sistem yang luas, seperti akses data (DBMS), pertukaran informasi melalui bus umum (JMS), pelaksanaan skrip terdistribusi dan lokal dengan pelestarian konsistensi (Transaksi), pemrosesan permintaan yang datang misalnya, melalui protokol http (s) (fastcgi) atau melalui soket web, dll ... Setiap aplikasi harus memiliki kemampuan untuk mengatur modulnya (OSGI), dan dalam sistem terdistribusi harus dapat mengatur aplikasi.


Contoh sistem terdistribusi lemah yang terdistribusi


sistem


Aplikasi


Contoh skema aplikasi server perusahaan perusahaan.


aplikasi


Saya telah memberikan definisi umum tentang aplikasi ini, jadi mari kita lihat apa yang ada di dunia C ++ untuk implementasi konsep ini. Yang pertama menunjukkan implementasi aplikasi adalah kerangka kerja grafis seperti Qt dan GTK, tetapi versi aplikasi mereka awalnya mengasumsikan bahwa aplikasi tersebut adalah "jendela" grafis dengan konteksnya dan hanya setelah beberapa saat visi umum aplikasi muncul, termasuk sebagai layanan sistem, misalnya, layanan qts . Tapi saya tidak benar-benar ingin menyeret kerangka kerja grafis yang kondisional untuk tugas layanan, jadi mari kita melihat ke perpustakaan non-grafis. Dan dorongan muncul dalam pikiran pertama ... Tapi sayangnya, tidak ada Peningkatan. Aplikasi dan sejenisnya dalam daftar perpustakaan resmi. Ada proyek Boost.Application yang terpisah. Proyek ini sangat menarik, tetapi, menurut saya, bertele-tele, meskipun ideologi dorongan dihormati. Berikut ini contoh aplikasi dari Boost.Application


#define BOOST_ALL_DYN_LINK #define BOOST_LIB_DIAGNOSTIC #define BOOST_APPLICATION_FEATURE_NS_SELECT_BOOST #include <fstream> #include <iostream> #include <boost/application.hpp> using namespace boost; // my application code class myapp { public: myapp(application::context& context) : context_(context) {} void worker() { // ... while (st->state() != application::status::stopped) { boost::this_thread::sleep(boost::posix_time::seconds(1)); if (st->state() == application::status::paused) my_log_file_ << count++ << ", paused..." << std::endl; else my_log_file_ << count++ << ", running..." << std::endl; } } // param int operator()() { // launch a work thread boost::thread thread(&myapp::worker, this); context_.find<application::wait_for_termination_request>()->wait(); return 0; } bool stop() { my_log_file_ << "Stoping my application..." << std::endl; my_log_file_.close(); return true; // return true to stop, false to ignore } private: std::ofstream my_log_file_; application::context& context_; }; int main(int argc, char* argv[]) { application::context app_context; // auto_handler will automatically add termination, pause and resume (windows) // handlers application::auto_handler<myapp> app(app_context); // to handle args app_context.insert<application::args>( boost::make_shared<application::args>(argc, argv)); // my server instantiation boost::system::error_code ec; int result = application::launch<application::server>(app, app_context, ec); if (ec) { std::cout << "[E] " << ec.message() << " <" << ec.value() << "> " << std::endl; } return result; } 

Contoh di atas mendefinisikan aplikasi myapp dengan utas pekerja utama dan mekanisme untuk meluncurkan aplikasi ini.
Sebagai tambahan, saya akan memberikan contoh serupa dari kerangka pocoproject


 #include <iostream> #include <sstream> #include "Poco/AutoPtr.h" #include "Poco/Util/AbstractConfiguration.h" #include "Poco/Util/Application.h" #include "Poco/Util/HelpFormatter.h" #include "Poco/Util/Option.h" #include "Poco/Util/OptionSet.h" using Poco::AutoPtr; using Poco::Util::AbstractConfiguration; using Poco::Util::Application; using Poco::Util::HelpFormatter; using Poco::Util::Option; using Poco::Util::OptionCallback; using Poco::Util::OptionSet; class SampleApp : public Application { public: SampleApp() : _helpRequested(false) {} protected: void initialize(Application &self) { loadConfiguration(); Application::initialize(self); } void uninitialize() { Application::uninitialize(); } void reinitialize(Application &self) { Application::reinitialize(self); } void defineOptions(OptionSet &options) { Application::defineOptions(options); options.addOption( Option("help", "h", "display help information on command line arguments") .required(false) .repeatable(false) .callback(OptionCallback<SampleApp>(this, &SampleApp::handleHelp))); } void handleHelp(const std::string &name, const std::string &value) { _helpRequested = true; displayHelp(); stopOptionsProcessing(); } void displayHelp() { HelpFormatter helpFormatter(options()); helpFormatter.setCommand(commandName()); helpFormatter.setUsage("OPTIONS"); helpFormatter.setHeader( "A sample application that demonstrates some of the features of the " "Poco::Util::Application class."); helpFormatter.format(std::cout); } int main(const ArgVec &args) { if (!_helpRequested) { logger().information("Command line:"); std::ostringstream ostr; logger().information(ostr.str()); logger().information("Arguments to main():"); for (const auto &it : args) { logger().information(it); } } return Application::EXIT_OK; } private: bool _helpRequested; }; POCO_APP_MAIN(SampleApp) 

Saya menarik perhatian Anda pada kenyataan bahwa aplikasi harus berisi mekanisme untuk logging, mengunduh konfigurasi dan opsi pemrosesan.
Misalnya, untuk memproses opsi ada:



Untuk mengkonfigurasi:



Untuk penjurnalan:



Kelemahan, modul, dan plugin.


Kelemahan dalam sistem "perusahaan" adalah kemungkinan penggantian mekanisme tertentu yang cepat dan tidak menyakitkan. Ini berlaku untuk modul dalam aplikasi dan aplikasi itu sendiri, serta implementasi, misalnya, layanan microser. Apa yang kita miliki, dari sudut pandang C ++. Semuanya buruk dengan modul, meskipun mereka mengimplementasikan antarmuka, tetapi mereka hidup di dalam aplikasi "dikompilasi", jadi tidak akan ada perubahan cepat, tetapi plugin datang menyelamatkan! Dengan bantuan perpustakaan dinamis, Anda tidak hanya dapat mengatur penggantian cepat, tetapi juga operasi simultan dari dua versi yang berbeda. Ada seluruh dunia "panggilan prosedur jarak jauh" alias RPC. Mekanisme pencarian untuk implementasi antarmuka, ditambah dengan RPC, melahirkan sesuatu yang mirip dengan OSGI dari dunia Java. Sangat bagus memiliki dukungan untuk ini dalam ekosistem C ++ dan ada satu, berikut adalah beberapa contoh:


Modul sampel untuk "server aplikasi" POCO OSP


 #include "Poco/OSP/BundleActivator.h" #include "Poco/OSP/BundleContext.h" #include "Poco/ClassLibrary.h" namespace HelloBundle { class BundleActivator: public Poco::OSP::BundleActivator { public: void start(Poco::OSP::BundleContext::Ptr pContext) { pContext->logger().information("Hello, world!"); } void stop(Poco::OSP::BundleContext::Ptr pContext) { pContext->logger().information("Goodbye!"); } }; } // namespace HelloBundle POCO_BEGIN_MANIFEST(Poco::OSP::BundleActivator) POCO_EXPORT_CLASS(HelloBundle::BundleActivator) POCO_END_MANIFEST 

Modul sampel untuk "server aplikasi" Apache Celix


 #include "Bar.h" #include "BarActivator.h" using namespace celix::dm; DmActivator* DmActivator::create(DependencyManager& mng) { return new BarActivator(mng); } void BarActivator::init() { std::shared_ptr<Bar> bar = std::shared_ptr<Bar>{new Bar{}}; Properties props; props["meta.info.key"] = "meta.info.value"; Properties cProps; cProps["also.meta.info.key"] = "also.meta.info.value"; this->cExample.handle = bar.get(); this->cExample.method = [](void *handle, int arg1, double arg2, double *out) { Bar* bar = static_cast<Bar*>(handle); return bar->cMethod(arg1, arg2, out); }; mng.createComponent(bar) //using a pointer a instance. Also supported is lazy initialization (default constructor needed) or a rvalue reference (move) .addInterface<IAnotherExample>(IANOTHER_EXAMPLE_VERSION, props) .addCInterface(&this->cExample, EXAMPLE_NAME, EXAMPLE_VERSION, cProps) .setCallbacks(&Bar::init, &Bar::start, &Bar::stop, &Bar::deinit); } 

Perlu dicatat bahwa dalam sistem terdistribusi lemah terhubung perlu untuk memiliki mekanisme yang memastikan operasi transaksional, tetapi saat ini tidak ada yang serupa untuk C ++. Yaitu sama seperti tidak ada cara di dalam satu aplikasi untuk membuat permintaan ke database, file dan ESB dalam satu transaksi, tidak ada cara untuk operasi terdistribusi. Tentu saja, semuanya bisa ditulis, tetapi tidak ada yang digeneralisasikan. Seseorang akan mengatakan bahwa ada software transactional memory , ya, tentu saja, tetapi itu hanya akan memudahkan penulisan mekanisme transaksi sendiri.


Toolkit


Dari semua alat bantu saya ingin menyoroti serialisasi dan DSL, karena kehadirannya memungkinkan Anda untuk mengimplementasikan banyak komponen dan skenario lainnya.


Serialisasi


Serialisasi adalah proses menerjemahkan struktur data ke dalam urutan bit. Kebalikan dari operasi serialisasi adalah operasi deserialization (penataan) - mengembalikan keadaan awal struktur data dari urutan bit wikipedia . Dalam konteks C ++, penting untuk dipahami bahwa saat ini tidak ada cara untuk membuat serial objek dan mentransfernya ke program lain yang sebelumnya tidak tahu apa-apa tentang objek ini. Dalam hal ini, maksud saya objek sebagai implementasi dari kelas tertentu dengan bidang dan metode. Oleh karena itu, saya akan menyoroti dua pendekatan utama yang digunakan di dunia C ++:


  • serialisasi ke format biner
  • serialisasi ke format formal

Dalam literatur dan di Internet, sering ada pemisahan ke dalam format biner dan teks, tetapi saya pikir pemisahan ini tidak sepenuhnya benar, misalnya, MsgPack tidak menyimpan informasi tentang jenis objek, sehingga, programmer diberi kendali atas tampilan yang benar dan format MsgPack adalah biner. Protobuf , sebaliknya, menyimpan semua meta-informasi dalam representasi perantara, yang memungkinkannya untuk digunakan di antara berbagai bahasa pemrograman, sementara Protobuf juga biner.
Jadi proses serialisasi, mengapa kita membutuhkannya. Untuk mengungkapkan semua nuansa, kita perlu artikel lain, saya akan mencoba menjelaskan dengan contoh. Serialisasi memungkinkan, sambil tetap menggunakan bahasa pemrograman, untuk "mengemas" entitas perangkat lunak (kelas, struktur) untuk mentransfernya melalui jaringan, untuk penyimpanan yang terus-menerus, misalnya, dalam file dan skrip lain, yang, tanpa serialisasi, memaksa kami untuk membuat protokol sendiri dan mempertimbangkan perangkat keras akun. dan platform perangkat lunak, penyandian teks, dll.
Berikut adalah beberapa perpustakaan sampel untuk serialisasi:



DSL


Domain Specific Language - bahasa pemrograman untuk area subjek Anda. Memang, ketika kita terlibat dalam otomatisasi perusahaan tertentu, kita dihadapkan dengan area subjek pelanggan dan menggambarkan semua proses bisnis dalam hal area subjek, tetapi begitu menyangkut pemrograman, programmer, bersama dengan analis, terlibat dalam memetakan konsep proses bisnis menjadi konsep. kerangka kerja dan bahasa pemrograman. Dan jika tidak ada sejumlah proses bisnis, dan area subjek didefinisikan dengan cukup ketat, masuk akal untuk membuat DSL Anda sendiri, untuk mengimplementasikan sebagian besar skenario yang ada dan menambahkan yang baru. Di dunia C ++, tidak ada banyak peluang untuk implementasi "cepat" DSL Anda. Tentu saja, ada mekanisme untuk menanamkan lua, javascript, dan bahasa pemrograman lain di C ++ - sebuah program, tetapi siapa yang butuh kerentanan dan mesin eksekusi yang berpotensi tidak terkendali untuk "semuanya"?! Jadi kami akan menganalisis alat yang memungkinkan Anda melakukan DSL sendiri.



Perpustakaan Boost.Proto hanya dirancang untuk membuat DSL Anda sendiri, ini adalah tujuan langsungnya, berikut adalah contohnya


 #include <iostream> #include <boost/proto/proto.hpp> #include <boost/typeof/std/ostream.hpp> using namespace boost; proto::terminal< std::ostream & >::type cout_ = { std::cout }; template< typename Expr > void evaluate( Expr const & expr ) { proto::default_context ctx; proto::eval(expr, ctx); } int main() { evaluate( cout_ << "hello" << ',' << " world" ); return 0; } 


Flex dan Bison digunakan untuk menghasilkan lexer dan parser untuk tata bahasa Anda. Sintaksnya tidak sederhana, tetapi menyelesaikan masalah secara efisien.
Kode contoh untuk menghasilkan lexer


 /* scanner for a toy Pascal-like language */ %{ /* need this for the call to atof() below */ #include <math.h> %} DIGIT [0-9] ID [az][a-z0-9]* %% {DIGIT}+ { printf( "An integer: %s (%d)\n", yytext, atoi( yytext ) ); } {DIGIT}+"."{DIGIT}* { printf( "A float: %s (%g)\n", yytext, atof( yytext ) ); } if|then|begin|end|procedure|function { printf( "A keyword: %s\n", yytext ); } {ID} printf( "An identifier: %s\n", yytext ); "+"|"-"|"*"|"/" printf( "An operator: %s\n", yytext ); "{"[^}\n]*"}" /* eat up one-line comments */ [ \t\n]+ /* eat up whitespace */ . printf( "Unrecognized character: %s\n", yytext ); %% main( argc, argv ) int argc; char **argv; { ++argv, --argc; /* skip over program name */ if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex(); } 

Namun, ada spesifikasi SCXML - State Chart XML: Notasi Mesin Negara untuk Abstraksi Kontrol, deskripsi mesin negara dalam markup mirip-XML. Ini bukan DSL, tetapi juga mekanisme yang nyaman untuk mengotomatisasi proses tanpa pemrograman. Qt SCXML memiliki implementasi yang sangat baik. Ada implementasi lain, tetapi mereka tidak begitu fleksibel.
Ini adalah contoh klien FTP dalam notasi SCXML, contoh yang diambil dari situs Dokumentasi Qt


 <scxml xmlns="http://www.w3.org/2005/07/scxml" version="1.0" name="FtpClient" datamodel="ecmascript"> <state id="G" initial="I"> <transition event="reply" target="E"/> <transition event="cmd" target="F"/> <state id="I"> <transition event="reply.2xx" target="S"/> </state> <state id="B"> <transition event="cmd.DELE cmd.CWD cmd.CDUP cmd.HELP cmd.NOOP cmd.QUIT cmd.SYST cmd.STAT cmd.RMD cmd.MKD cmd.PWD cmd.PORT" target="W.general"/> <transition event="cmd.APPE cmd.LIST cmd.NLST cmd.REIN cmd.RETR cmd.STOR cmd.STOU" target="W.1xx"/> <transition event="cmd.USER" target="W.user"/> <state id="S"/> <state id="F"/> </state> <state id="W"> <onentry> <send eventexpr="&quot;submit.&quot; + _event.name"> <param name="params" expr="_event.data"/> </send> </onentry> <transition event="reply.2xx" target="S"/> <transition event="reply.4xx reply.5xx" target="F"/> <state id="W.1xx"> <transition event="reply.1xx" target="W.transfer"/> </state> <state id="W.transfer"/> <state id="W.general"/> <state id="W.user"> <transition event="reply.3xx" target="P"/> </state> <state id="W.login"/> </state> <state id="P"> <transition event="cmd.PASS" target="W.login"/> </state> </state> <final id="E"/> </scxml> 

Dan itu terlihat di visualizer SCXML


Ftp-client-scxml


Akses dan Integrasi Data


Ini mungkin salah satu topik paling "sakit" di dunia dengan ++. Dunia data untuk pengembang c ++ selalu terhubung dengan kebutuhan untuk dapat menampilkannya pada esensi bahasa pemrograman. Baris dalam tabel adalah objek atau struktur, json ada di kelas, dan sebagainya. Dengan tidak adanya refleksi - ini adalah masalah besar, tapi kami, dengan ++ - julukan, jangan putus asa dan menemukan berbagai cara keluar dari situasi tersebut. Mari kita mulai dengan DBMS.


Sekarang saya akan menjadi hal biasa, tetapi ODBC adalah satu-satunya mekanisme universal untuk mengakses DBMS relasional, belum ada opsi lain yang ditemukan, tetapi C ++ - komunitas tidak tinggal diam dan saat ini ada perpustakaan dan kerangka kerja yang menyediakan antarmuka akses umum ke beberapa DBMS.
Pertama-tama, saya akan menyebutkan pustaka yang menyediakan akses terpadu ke DBMS menggunakan pustaka klien dan SQL



Semuanya bagus, tetapi mereka membuat Anda ingat nuansa menampilkan data dari database ke dalam objek dan struktur C ++, ditambah efisiensi kueri SQL yang langsung jatuh di pundak Anda.
Contoh-contoh berikut adalah ORM di C ++. Ya ada! Dan omong-omong, SOCI mendukung mekanisme ORM melalui spesialisasi soci :: type_conversion, tapi saya sengaja tidak memasukkannya, karena ini bukan tujuan langsungnya.


  • LiteSQL C ++ - ORM, yang memungkinkan Anda berinteraksi dengan DBMS SQLite3, PostgreSQL, MySQL. Perpustakaan ini mengharuskan pemrogram untuk pra-desain xml-file dengan deskripsi objek dan hubungan untuk menghasilkan sumber tambahan menggunakan litesql-gen.
  • ODB dari Code Synthesis adalah ORM yang sangat menarik, memungkinkan Anda untuk tetap berada dalam C ++, tanpa menggunakan file deskripsi perantara, berikut adalah contoh kecil:

 #pragma db object class person { // ... private: friend class odb::access; person () {} #pragma db id string email_; string name_; unsigned short age_; }; // ... odb::sqlite::database db ("people.db"); person john ("john@doe.org", "John Doe", 31); odb::transaction t (db.begin ()); db.persist (john); typedef odb::query<person> person_query; for (person& p: db.query<person> (person_query::age < 30)); cerr << p << endl; jane.age (jane.age () + 1); db.update (jane); t.commit (); 

  • Wt ++ adalah kerangka kerja besar, Anda dapat menulis artikel terpisah tentangnya secara umum, itu juga mengandung ORM yang dapat berinteraksi dengan DBMS Sqlite3, Firebird, MariaDB / MySQL, Server MSSQL, PostgreSQL dan Oracle.
  • Saya juga ingin menyebutkan ORM di atas sqlite sqlite_orm dan hiberlite . Karena sqlite adalah DBMS tertanam, dan ORM untuknya memeriksa kueri, dan memang semua interaksi dengan database, dalam waktu kompilasi, alat menjadi sangat nyaman untuk penyebaran dan pembuatan prototipe yang cepat.
  • QHibernate - ORM untuk Qt5 dengan dukungan Postgresql. Direndam dengan ide hibernasi dari java.

Meskipun integrasi melalui DBMS dianggap "integrasi", saya lebih suka meninggalkannya di luar tanda kurung dan beralih ke integrasi melalui protokol dan API.


  • RPC - panggilan jarak jauh jarak jauh, teknik yang terkenal untuk interaksi "klien" dengan "server". Seperti dalam kasus ORM, kesulitan utama adalah menulis / membuat berbagai file tambahan untuk menghubungkan protokol dengan fungsi nyata dalam kode. Saya sengaja tidak akan menyebutkan berbagai RPC yang diimplementasikan secara langsung dalam sistem operasi, tetapi saya akan fokus pada solusi lintas platform.


    • grpc adalah kerangka kerja dari Google untuk panggilan prosedur jarak jauh, kerangka kerja yang sangat populer dan efisien dari google. Ini pada dasarnya menggunakan google protobuf, saya sebutkan di bagian serialisasi, mendukung banyak bahasa pemrograman, tetapi baru di lingkungan perusahaan.
    • json-rpc - RPC, di mana JSON digunakan sebagai protokol, contoh implementasi yang baik adalah pustaka libjson-rpc-cpp , berikut adalah contoh file deskripsi:

     [ { "name": "sayHello", "params": { "name": "Peter" }, "returns" : "Hello Peter" }, { "name" : "notifyServer" } ] 

    Berdasarkan uraian ini, kode klien dan server dihasilkan yang dapat digunakan dalam aplikasi Anda. Secara umum, ada spesifikasi untuk JSON-RPC 1.0 dan 2.0 . Jadi, memanggil fungsi dari aplikasi web, dan memprosesnya dalam C ++ tidak sulit.


    • XML-RPC dan SOAP - pemimpin yang jelas di sini - adalah gSOAP , perpustakaan yang sangat kuat, saya tidak berpikir ada alternatif yang layak. Seperti pada contoh sebelumnya, kami membuat file perantara dengan konten xml-rpc atau sabun, mengatur generator di atasnya, mendapatkan kode dan menggunakannya. Contoh permintaan dan respons tipikal dalam notasi xml-rpc:

     <?xml version="1.0"?> <methodCall> <methodName>examples.getState</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall> <methodResponse> <params> <param> <value><string>State-Ready</string></value> </param> </params> </methodResponse> 

    • Poco :: RemotingNG adalah proyek yang sangat menarik dari pocoproject. Memungkinkan Anda menentukan kelas, fungsi, dll. dapat disebut jarak jauh menggunakan anotasi dalam komentar. Berikut ini sebuah contoh

     typedef unsigned long GroupID; typedef std::string GroupName; //@ serialize struct Group { Group(GroupID _id_, const GroupName &_name_) : id(_id_), name(_name_) {} Group() {} //@ mandatory=false GroupID id; //@ mandatory=false GroupName name; }; // ... //@ remote class EXTERNAL_API GInfo { public: typedef Poco::SharedPtr<GInfo> Ptr; GInfo(); virtual Group getGroup() const = 0; virtual ~GInfo(); }; 

    Untuk menghasilkan kode tambahan, "kompiler" sendiri digunakan. Untuk waktu yang lama, fungsi ini hanya dalam versi berbayar dari Kerangka POCO, tetapi dengan munculnya proyek macchina.io , Anda dapat menggunakannya secara gratis.


  • Perpesanan adalah konsep yang agak luas, tetapi saya akan menganalisisnya dari sudut pandang pengiriman pesan melalui bus data umum, yaitu, saya akan pergi melalui perpustakaan dan server yang mengimplementasikan Java Message Service menggunakan berbagai protokol, misalnya AMQP atau STOMP . Bus data umum, juga disebut Enterprise Servise Bus (ESB), sangat umum dalam solusi segmen perusahaan memungkinkan Anda untuk dengan cepat mengintegrasikan berbagai elemen infrastruktur TI di antara mereka sendiri, menggunakan pola point-to-point dan mempublikasikan-berlangganan. Ada beberapa broker pesan industri yang ditulis dalam C ++, saya tahu dua: Apache Qpid dan UPMQ , dan yang kedua ditulis oleh saya. Ada Eclipse Mosquitto , tetapi ditulis dalam huruf si. Keindahan JMS untuk java adalah bahwa kode Anda tidak bergantung pada protokol yang digunakan klien dan server, JMS sebagai ODBC, menyatakan fungsi dan perilaku, sehingga Anda dapat mengubah penyedia JMS setidaknya sekali sehari dan tidak menulis ulang kode, untuk C ++, sayangnya, tidak. Anda harus menulis ulang bagian klien untuk setiap penyedia. Menurut pendapat saya, perpustakaan C ++ paling populer untuk pialang pesan yang tidak kalah populer:



    Prinsip bahwa perpustakaan ini menyediakan fungsionalitas umum umumnya konsisten dengan spesifikasi JMS. Dalam hal ini, ada keinginan untuk mengumpulkan sekelompok orang yang berpikiran sama dan menulis semacam ODBC, tetapi untuk broker pesan, sehingga setiap programmer C ++ menderita sedikit kurang dari biasanya.



Konektivitas jaringan


Saya sengaja meninggalkan segala sesuatu yang terhubung langsung dengan interaksi jaringan sampai akhir, karena dalam bidang ini, pengembang C ++ memiliki masalah paling kecil, menurut saya. Tinggal memilih pola yang paling dekat dengan keputusan Anda, dan kerangka kerja yang mengimplementasikannya. Sebelum mendaftar perpustakaan paling populer, saya ingin mencatat detail penting dalam mengembangkan aplikasi jaringan Anda sendiri. Jika Anda memutuskan untuk membuat protokol Anda sendiri melalui TCP atau UDP, bersiaplah bahwa semua jenis alat keamanan "pintar" akan memblokir lalu lintas Anda, jadi berhati-hatilah dalam mengemas protokol Anda, misalnya, di https atau mungkin ada masalah. Jadi perpustakaan:


  • Boost.Asio dan Boost.Beast - salah satu implementasi paling populer untuk komunikasi jaringan asinkron, ada dukungan untuk HTTP dan WebSockets
  • Poco :: Net juga merupakan solusi yang sangat populer, dan di samping interaksi mentah, Anda dapat menggunakan kelas-kelas siap dari Kerangka Server TCP, Kerangka Reaktor, serta kelas klien dan server untuk HTTP, FTP dan E-Mail. Ada juga dukungan untuk WebSockets
  • ACE - tidak pernah menggunakan perpustakaan ini, tetapi rekan mengatakan bahwa itu juga perpustakaan yang layak, dengan pendekatan terintegrasi untuk mengimplementasikan aplikasi jaringan dan banyak lagi.
  • Qt Network - di Qt, bagian jaringan diimplementasikan dengan baik. Satu-satunya titik kontroversial adalah sinyal dan slot untuk solusi server, meskipun server berada pada Qt !?

Total


Jadi, apa yang ingin saya katakan adalah gambaran dari perpustakaan ini. Jika saya berhasil, maka Anda memiliki kesan bahwa seolah-olah ada "edisi perusahaan", tetapi tidak ada solusi untuk penerapan dan penggunaannya, hanya kebun binatang perpustakaan. Jadi memang begitu. Ada lebih atau kurang perpustakaan yang lengkap untuk mengembangkan aplikasi untuk segmen korporat, tetapi tidak ada solusi standar. Pada saya sendiri, saya hanya dapat merekomendasikan pocoproject dan maccina.io sebagai titik awal dalam meneliti solusi untuk backend dan meningkatkan untuk setiap kasus, dan tentu saja saya mencari orang yang berpikiran sama untuk mempromosikan konsep "C ++ Enterprise Edition"!

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


All Articles