1. 程式人生 > >利用命令模式(ElasticSearch+RabbitMq)實現資料非同步儲存

利用命令模式(ElasticSearch+RabbitMq)實現資料非同步儲存

寫在前面 —— 本文原始碼

在使用ElasticSearch(下文簡稱es)經常會遇到將本地庫的資料傳入的es中進行索引.我們在完成批量同步的時候可以使用官方提供的logstash來進行同步,也可以自己編寫java api 利用es的blak進行批量同步.
在實際生產中利用es做搜尋引擎,將資料庫中的資料索引到es中,在這種情況下需要的是實時性和更高的操作性,有如下幾種方法可以完成:

  • 使用資料庫二進位制監控(中介軟體)
    • 使用一些資料庫二進位制檔案監控中介軟體,通過監控資料庫的二進位制檔案來判斷資料庫發生的增刪改查,從而去動態的更新es中的索引資訊例如阿里的精衛,等二進位制日誌監控元件.
  • 使用訊息轉發(訊息中介軟體)
    • 通過RabbitMq或者是訊息佇列將需要索引到es的資料上報給search服務然後在服務裡使用es的api進行操作將資料索引到es上.

涉及到的技術

  • ElasticSearch:2.3.2(有待升級,emmmm和老大說了好久終於準備升級到最新版本了,所以涉及到的很多api可能都用不了了,這裡暫時就先用SpringBoot提供的jpa簡單操作下~~畢竟沒有涉及到搜尋,目前只是對資料進行索引.
  • Spring Boot:1.5.10
  • RabbitMq:Spring Boot封裝的api
  • FastJson:阿里的json操控包
  • 命令模式:為了統一規範化,在search服務中使用命令模式定義各種操作命令,之後進行組裝來完成對es的操作.

簡單的架構圖和資料流圖

這裡寫圖片描述

命令模式簡介

模式結構

命令模式包含如下角色:
- Command:抽象命令
- ConcreteCommand:具體命令類
- Invoker:呼叫者
- Receiver:接收者
- Client:客戶類

意圖

命令模式(Command Pattern):將請求封裝為一個物件,從而使我們可用不同的請求對客戶進>行引數化;隊請求排隊或者記錄請求日誌,以及支援可撤銷操作.命令模式是一種物件行為模式,泣別名為動作(Action)模式或事物(Transaction)模式.

模式結構

命令模式包含如下角色:
- Command:抽象命令
- ConcreteCommand:具體命令類
- Invoker:呼叫者
- Receiver:接收者
- Client:客戶類

適用情況

  • command模式類似於過程語言中的回撥,command是將回調通過面向物件的方式來實現,在我們需要將方法提前設計出來在需要的時候被呼叫,此時我們就可以使用命令模式.
  • 在不同的時刻指定,排序和執行請求.一個Command隊想可以有一個與初始請求無關的生存週期.如果一個請求的接受者可以用一種與地址空間無關的方式表達,那麼就可以將請求的命令傳送到另一個不同的程序並在那實現請求.
  • 支援取消的操作.再設計Command的介面可以設計一個Unexcute用來實現將上一部的執行取消的操作.通過excute和unexcute來控制命令的執行效果.
  • 支援修改日誌.在使用命令模式的時候我們可以新增一個儲存裝置將執行的操作儲存起來以防止系統down機的時候進行回覆.
  • 用來在源操作語言上構建更高層的作業系統.命令模式是一種典型的支援事務的設計模式
  • 通過一個Command藉口來進行建模.

效果

Command有如下的效果:
1. Command將呼叫操作的物件與如何實現該操作的物件進行解耦.
2. Command是頭等物件他可以被擴充套件和操控.
3. 可以將多個命令集合起來變成一個組合命令.
4. 新增一個Command很容易因為他是頭等類無需改變任何程式碼.

search-server關鍵程式碼類圖

這裡寫圖片描述

相關推薦

利用命令模式(ElasticSearch+RabbitMq)實現資料非同步儲存

寫在前面 —— 本文原始碼 在使用ElasticSearch(下文簡稱es)經常會遇到將本地庫的資料傳入的es中進行索引.我們在完成批量同步的時候可以使用官方提供的logstash來進行同步,也可以自己編寫java api 利用es的blak進行批量同步.

設計模式——命令模式(C++實現

clear cto ive pre urn bak std oot style 1 [root@ ~/learn_code/design_pattern/19_order]$ cat order.cpp 2 #include <

Command Pattern -- 命令模式原理及實現(C++)

主要參考《大話設計模式》和《設計模式:可複用面向物件軟體的基礎》兩本書。本文介紹命令模式的實現。            What it is:Encapsulate a request as an object, thereby letting you parameterize clients with di

springboot+elasticsearch + rabbitMQ實現全文檢索(專案搭建)

最近做一個社群類的專案:實現全文檢索 開發完成做一個總結記錄。 spring-boot-1.5.9.RELEASE ES 5.6.4 首先搭建ES環境 引用大佬文章 搭建ES環境: https://blog.csdn.net/u012270682/article/details/7293

springboot+elasticsearch + rabbitMQ實現全文檢索(項目搭建)

runt mage ans log 127.0.0.1 改變 引用 復制 ping 最近做一個社區類的項目:實現全文檢索 開發完成做一個總結記錄。 spring-boot-1.5.9.RELEASE ES 5.6.4 首先搭建ES環境 引用大佬文章 搭建ES環境: http

springboot+elasticsearch + rabbitMQ實現全文檢索(springboot+ES整合)

known https vnr builder mod hystrix connector uid bsp springboot 2.X 能用 springboot-data-ES 5.X的 用特殊方式引入 5.X的ES 配置 bootstrap.xml 因為在調試,所

[譯] 利用 Python中的 Bokeh 實現資料視覺化,第三部分:製作一個完整的儀表盤

原文地址:Data Visualization with Bokeh in Python, Part III: Making a Complete Dashboard 原文作者:Will Koehrsen 譯文出自:掘金翻譯計劃 本文永久連結:github.com/xitu/g

利用SQL2005資料庫複製技術 實現資料同步更新

一個手工同步的方案 --定時同步伺服器上的資料 --例子: --測試環境,SQL Server2000,遠端伺服器名:xz,使用者名稱為:sa,無密碼,測試資料庫:test --伺服器上的表(查詢分析器連線到伺服器上建立) create table [user](id int primary key,numb

Windows下使用curl命令elasticsearch匯入示例資料出錯問題

準備工作 假設你已經安裝好了kibana和elasticsearch, 使用kibana,在載入資料之前,我們需要建立一個對映的欄位。 首先建立一個名為shakespeare的索引 可以在kibana控制檯執行: PUT /shakespear

利用崑崙通態觸控式螢幕實現資料採集和邏輯判斷的例子

      別小瞧國產觸控式螢幕,用得好,可以實現複雜功能,比如說資料計算、簡單邏輯、資料轉發、裝置控制,甚至能在簡單應用中省掉一套PLC。     某裝置需求:通過崑崙通態觸控式螢幕實現力值資料採集,標定,最大值計算,到位報警,後續資料計算,並列印試驗結果,初始值儲存、資料

在AngularJS中是如何實現資料非同步呼叫的?

     $q服務是AngularJS封裝的一種輕量級的 Promise實現。$q服務既可呼叫它的構造器(呼叫構造器時返回一個Promise物件),也可呼叫如下方法。      1.defer():建立一個deferred物件,這個物件可以執行幾個常用的方法,比如resolv

利用word的xml格式實現資料填充

    以前利用word做模板都是用書籤來做佔位符,但缺點就是插進去的書籤顯示不明顯,無法在文件中直接顯示,現在發現用xml格式會方便很多。     操作步驟如下:    1.編寫例項類。 public class Student { private

命令模式(c++實現

# 命令模式 [TOC] ## 模式定義 **命令模式(Command)**,將一個請求封裝為一個物件,從而使你可用不同的請求對客戶進行引數化;對請求排隊或記錄請求日誌,以及支援可撤銷的操作。 ## 模式動機 - 敏捷開發的原則告訴我們,不要為程式碼新增基於猜測的、實際不需要的功能。如果不清楚一個系

HTML 5 中WebStorage實現資料本地儲存

webstorage 分sessionStorage和localstorage,sessionStorage是臨時儲存,localStorage是永久儲存。 sessionStorage如果瀏覽器關閉了,資料就沒有了,而localStorage則不會。 sessionSto

PostGIS+QGIS+GeoServer+OpenLayers實現資料儲存、服務的釋出以及地圖的顯示

標題比較長,主要呢是實現以下幾點: 1、將shp資料匯入到PostGIS中; 2、Geoserver釋出WMS服務; 3、Openlayers呼叫Wms服務 首先,下載安裝軟體。 為方便大家下載,我將所有軟體上傳的百度網盤裡了,有需要的可以上網盤直接下載,地址為:http

Spring整合Rabbitmq收集Logback日誌,利用進行Logstash資料整理儲存Elasticsearch

專案中我們常用的是把Logback列印的日誌儲存到檔案中儲存到硬碟上,這樣不利於日誌的收集和分析。 以下演示在SpringBoot中通過rabbitmq收集logback日誌儲存到Elasticsearch中。 環境準備:安裝RabbitMQ,安裝Elasticsearc

C# Aspect-Oriented Programming(AOP) 利用多種模式實現動態代理

style erp all 可操作性 mar targe spa min 異常 什麽是AOP(Aspect-Oriented Programming)? AOP允許開發者動態地修改靜態的OO模型,構造出一個能夠不斷增長以滿足新增需求的系統,就象現實世界中的對象會在其生命周期

命令模式-實現undo和redo

else new object out isp idt .com 行處理 ++  這次實驗主要是實現多次redo和undo,即程序的撤回和恢復,這裏只實現加法的撤回和恢復。     程序的撤回和恢復就是由所使用的軟件來記錄操作步驟,可以將數據恢復到某個操作狀態。     撤

利用js-xlsx.js外掛實現Excel檔案匯入並解析Excel資料成json資料格式

<!--本文轉載於網路,有太多一樣的文章,不知道原作者是哪位了,就不註明出處了。這裡記載下來,用於自己的學習借鑑--><!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8">

Django+celery+ RabbitMQ實現非同步任務

一,首先安裝celery pip install django-celery 二,安裝rabbitmq ubuntu環境下執行以下 sudo apt-get install rabbitmq-server 新增使用者,myuser為使用者名稱,mypassword為使用者