ringkasan:
Arsitektur, didistribusikan, antrian log, dan judulnya sendiri adalah fungsi koleksi log, tetapi redis ditambahkan di tengah untuk membuat antrian pesan. Mengapa saya membutuhkan antrian pesan? Ketika faktor -faktor seperti "produksi" dan "konsumsi" muncul dalam sistem tidak konsisten, antrian pesan diperlukan untuk bertindak sebagai lapisan abstrak untuk menjembatani perbedaan antara kedua pihak.
Arsitektur, didistribusikan, antrian log, dan judulnya sendiri adalah fungsi koleksi log, tetapi redis ditambahkan di tengah untuk membuat antrian pesan.
Mengapa saya membutuhkan antrian pesan?
Ketika faktor -faktor seperti "produksi" dan "konsumsi" muncul dalam sistem tidak konsisten, antrian pesan diperlukan untuk bertindak sebagai lapisan abstrak untuk menjembatani perbedaan antara kedua pihak.
Misalnya, email umum dan SMS yang mengirim sistem kami menulis fungsi -fungsi ini yang tidak memerlukan respons tepat waktu terhadap antrian, permintaan proses secara tidak sinkron, dan mengurangi waktu respons.
Bagaimana cara mencapainya?
Ada banyak produk middleware antrian pesan JMS yang matang di pasaran, tetapi berdasarkan pada arsitektur proyek saat ini dan situasi penyebaran, kami menggunakan Redis sebagai antrian pesan.
Mengapa Menggunakan Redis?
Struktur data daftar di Redis memiliki karakteristik "antrian ganda", dan Redis memiliki kemampuan untuk bertahan data, sehingga Redis sangat aman dan dapat diandalkan untuk mengimplementasikan antrian terdistribusi.
Ini mirip dengan "antrian" dalam JMS, kecuali bahwa fungsionalitas dan keandalan (transaksionalitas) tidak seketat JMS. Redis sendiri memiliki kinerja tinggi dan desain terdistribusi "nyaman" (Replicas, Sharding), yang dapat memberikan dasar yang baik untuk menerapkan "antrian terdistribusi".
Sisi penyedia
Proyek ini menggunakan plugin redis plugin redis-redis pihak ketiga. Jika Anda tidak yakin bagaimana menggunakannya, silakan Google atau Baidu.
Redis.Properties:
#Redis Configuration Center redis.host = 192.168.1.180redis.port = 6379redis.password = 123456redis.maxidle = 100 redis.maxactive = 300 redis.maxwait = 1000 redis.testonborrow = true redis.timeout = 100000
Konfigurasi Redis:
<!-Redis Configuration-> <bean id = "jedispoolconfig" /> <bean id = "jedisconnectionfactory"> <properti name = "hostname" value = "$ {redis.host}" /> <name properti = "port" value = "$ {redis.port}" /<nama properti = "port" port "$ {$ {redis.port}" /> name="timeout" value="${redis.timeout}" /> <property name="poolConfig" ref="jedisPoolConfig" /> <property name="usePool" value="true" /> </bean> <bean id="redisTemplate"> <property name="connectionFactory" ref="jedisConnectionFactory" /> </bean> Konfigurasi log sectional (pseudocode):
/*** Log Sistem, Kelas Pemrosesan Facet* Pencipta Xiaoqi 2012* Waktu Penciptaan 15 Januari 2018*/@Component@scope@aspectpublic class Syslogaspect {@Autowired private redistemplate <string, string> redistemplate; // Anotasi didasarkan pada API Swagger, dan Anda juga dapat mendefinisikan @pointcut (" @annotation (io.swagger.annotations.apioperation)") public void logpointcut () {} @around ("logpointcut ()") objek publik di sekitar (rROCEDINGJOIN POINT) melempar {objek logpointcut () ") pointed (rROCEDINGGOIN POINT) Lempar {Object {object = point. // Tulis pesan log ke channel ITSTYLE_LOG redistemplate.convertandsend ("itstyle_log", "log data, prosesnya sendiri"); hasil pengembalian; }}Sisi konsumen
Konfigurasi Redis:
<!-Redis Configuration-> <bean id = "jedispoolconfig" /> <bean id = "jedisconnectionfactory"> <properti name = "hostname" value = "$ {redis.host}" /> <name properti = "port" value = "$ {redis.port}" /<nama properti = "port" port "$ {$ {redis.port}" /> name="timeout" value="${redis.timeout}" /> <property name="poolConfig" ref="jedisPoolConfig" /> <property name="usePool" value="true" /> </bean> <bean id="redisTemplate" p:connection-factory-ref="jedisConnectionFactory"> <property name="keySerializer"> <bean /> </property> <Properti Nama = "Hashkeyserializer"> <bean/> </prop Property> </ bean> <!-Mendengarkan kelas implementasi-> <bean id = "pendengar"/> <bean id = "stringredisserializer"/<redis yang benar-benar. Untuk berlangganan-> <redis: listener ref = "listener" serializer = "stringredisserializer" method = "handlelog" topic = "itstyle_log"/> </redis: listener-container>Antarmuka mendengarkan:
Antarmuka Publik MessageDeLeGatElistener {public void handlelog (pesan serializable);}Implementasi Mendengarkan:
Public Class MessageDeLeGeListenerImpl mengimplementasikan MessageDeLeGateListener {@Override public void handlelog (pesan serializable) {if (message == null) {System.out.println ("null"); } else {// proses log log}}}Q&A
【Pertanyaan 1】 Mengapa menggunakan Redis?
Sebenarnya, sudah ada penjelasan di atas, meskipun ada banyak produk yang sangat stabil di pasaran, seperti Kafka, RabbitMQ dan RocketMQ yang mungkin Anda pikirkan. Namun, karena proyek itu sendiri menggunakan Redis sebagai cache terdistribusi, Redis dipilih berdasarkan prinsip menyimpan masalah dan kelayakan.
[Pertanyaan 2] Bagaimana cara menyimpan data log?
Pada prinsipnya, tidak disarankan untuk menyimpannya di database relasional, seperti MySQL. Lagi pula, jumlah log yang dihasilkan sangat besar, sehingga disarankan untuk menyimpannya dalam database non-relasional seperti Elasticsearch.
[Pertanyaan 3] Bagaimana pengumpulan log sectional diimplementasikan?
Log bagian perlu memperkenalkan paket toples terkait aspek-spring, dan konfigurasi membuat Spring mengadopsi proxy CGLIB.
Kode sumber proyek open source (referensi): https://gitee.com/52itstyle/spring-boot-mail
Meringkaskan
Di atas adalah antrian log yang didistribusikan Redis untuk arsitektur proyek Javaweb yang diperkenalkan kepada Anda oleh editor. Saya harap ini akan membantu Anda. Jika Anda memiliki pertanyaan, silakan tinggalkan saya pesan dan editor akan membalas Anda tepat waktu. Terima kasih banyak atas dukungan Anda ke situs web Wulin.com!