まとめ:
アーキテクチャ、分散、ログキュー、およびタイトル自体はログコレクション関数ですが、メッセージキューを作成するためにRedisが中央に追加されます。メッセージキューが必要なのはなぜですか?システムに「生産」や「消費」などの要因が一貫していない場合、2つの当事者間の違いを埋めるための抽象的なレイヤーとして機能するためにメッセージキューが必要です。
アーキテクチャ、分散、ログキュー、およびタイトル自体はログコレクション関数ですが、メッセージキューを作成するためにRedisが中央に追加されます。
メッセージキューが必要なのはなぜですか?
システムに「生産」や「消費」などの要因が一貫していない場合、2つの当事者間の違いを埋めるための抽象的なレイヤーとして機能するためにメッセージキューが必要です。
たとえば、私たちのシステムで送信する一般的な電子メールとSMSは、キューへのタイムリーな応答を必要としないこれらの機能を書き込み、プロセスを非同期に要求し、応答時間を短縮します。
それを達成する方法は?
市場には多くの成熟したJMSメッセージキューミドルウェア製品がありますが、現在のプロジェクトアーキテクチャと展開の状況に基づいて、Redisをメッセージキューとして使用します。
なぜRedisを使用するのですか?
Redisのリストデータ構造には「両端のキュー」の特性があり、Redisにはデータを持続する機能があるため、Redisは分散キューを実装するために非常に安全で信頼性があります。
これは、JMSの「キュー」に似ていますが、機能と信頼性(取引性)がJMSほど厳格ではないことを除きます。 Redis自体には、高性能で「便利な」分散デザイン(レプリカ、シャード)があり、「分散キュー」を実装するための優れた基盤を提供できます。
プロバイダー側
このプロジェクトでは、サードパーティのRedisプラグインSpring-Data-Redisを使用しています。使用方法がわからない場合は、Googleまたは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
Redis構成:
<! - redis configuration-> <bean id = "jedispoolconfig" /> <bean id = "jedisconnectionfactory"> <property name = "hostname" value = "$ {redis.host}" /> <プロパティname = "port" value = "$ {redis.port}" /> <property name = "$" "$" "$" "$" name = "timeout" value = "$ {redis.timeout}" /> <プロパティ名= "poolconfig" ref = "jedispoolconfig" /> <プロパティname = "usepool" value = "true" /> < /bean> <bean id = "redistemplate"> <プロパティ名= "connectionFactory断面ログ構成(pseudocode):
/***システムログ、ファセット処理クラス* creator xiaoqi 2012*作成時間2018年1月15日*/@component@scope@saspepublic class syslogaspect {@autowired private redistemplate <string、string> redistemplate; //アノテーションはswagger APIに基づいており、@pointcut( " @annotation(io.swagger.annotations.apioperation)")public void logpointcut(){} @around( "logpointcut()")パブリックオブジェクトの周りのパブリックオブジェクトを定義することもできます。 // itstyle_logチャンネルredistemplate.convertandsend( "itstyle_log"、 "log data、自分で処理する");返品結果; }}消費者側
Redis構成:
<! - redis configuration-> <bean id = "jedispoolconfig" /> <bean id = "jedisconnectionfactory"> <property name = "hostname" value = "$ {redis.host}" /> <プロパティname = "port" value = "$ {redis.port}" /> <property name = "$" "$" "$" "$" name = "timeout" value = "$ {redis.timeout}" /> <プロパティ名= "poolconfig" ref = "jedispoolconfig" /> <プロパティ名= "usepool" value = "true" /> < /bean> <bean id = "redistemplate" p:connection-factory-ref = "jedisconneftionfactory"> < </property> <Property name = "Hashkeyserializer"> <Bean/> </property> </bean> <! - 実装クラスを聴く - > <bean id = "リスナー"/> <bean id = "stringredisserializer"/> <redis:リスナーとコテインの接続factory = "jedisconnectionfactory"登録 - > <redis:リスナーref = "リスナー" serializer = "stringredisserializer" method = "handlelog"トピック= "itstyle_log"/> </redis:ristener-container>リスニングインターフェイス:
パブリックインターフェイスMESSAGEDELEGATELISTENER {public void handlelog(serializable message);}リスニング実装:
パブリッククラスMESSAGEDELEGATELISTENERIMPLはMESSAGEDELEGATELISTENER {@Override public void handlelog(serializable message){if(message == null){system.out.println( "null"); } else {//プロセスログデータ}}}Q&A
【質問1 redisを使用する理由
実際には、上記の説明はすでにありますが、市場には多くの非常に安定した製品があります。ただし、プロジェクト自体はRedisを分散キャッシュとして使用するため、Redisはトラブルと実行可能性を節約する原則に基づいて選択されます。
[質問2]ログデータの保存方法は?
原則として、MySQLなどのリレーショナルデータベースに保存することはお勧めしません。結局のところ、生成されたログの数は膨大なので、ElasticSearchなどの非関係データベースに保存することをお勧めします。
[質問3]断面ログのコレクションはどのように実装されていますか?
セクションログでは、Spring-Aspects関連のJARパッケージを導入する必要があり、構成によりSpringはCGLIBプロキシを採用します。
オープンソースプロジェクトソースコード(参照):https://gitee.com/52itstyle/spring-boot-mail
要約します
上記は、編集者が紹介したJavawebプロジェクトアーキテクチャのRedis分散ログキューです。それがあなたに役立つことを願っています。ご質問がある場合は、メッセージを残してください。編集者は時間内に返信します。 wulin.comのウェブサイトへのご支援ありがとうございます!