早期需要延遲處理的業務場景,更多的是通過定時任務掃表,然后執行滿足條件的記錄,具有頻率高、命中低、資源消耗大的缺點。隨著消息中間件的普及,延遲消息可以很好的處理這種場景,本文主要介紹延遲消息的使用場景以及基于常見的消息中間件如何實現延遲隊列,最后給出了一個在網易公開課使用延遲隊列的實踐。
創新互聯專注于企業營銷型網站、網站重做改版、托里網站定制設計、自適應品牌網站建設、成都h5網站建設、商城網站建設、集團公司官網建設、外貿營銷網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為托里等各大城市提供網站開發制作服務。
1、有效期:限時活動、拼團。。。
2、超時處理:取消超時未支付訂單、超時自動確認收貨。。。
4、重試:網絡異常重試、打車派單、依賴條件未滿足重試。。。
5、定時任務:智能設備定時啟動。。。
1、RabbitMQ
1)簡介:基于AMQP協議,使用Erlang編寫,實現了一個Broker框架
a、Broker:接收和分發消息的代理服務器
b、Virtual Host:虛擬主機之間相互隔離,可理解為一個虛擬主機對應一個消息服務
c、Exchange:交換機,消息發送到指定虛擬機的交換機上
d、Binding:交換機與隊列綁定,并通過路由策略和routingKey將消息投遞到一個或多個隊列中
e、Queue:存放消息的隊列,FIFO,可持久化
f、Channel:信道,消費者通過信道消費消息,一個TCP連接上可同時創建成百上千個信道,作為消息隔離
2)延遲隊列實現:RabbitMQ的延遲隊列基于消息的存活時間TTL(Time To Live)和死信交換機DLE(Dead Letter Exchanges)實現
a、TTL:RabbitMQ支持對隊列和消息各自設置存活時間,取二者中較小的值,即隊列無消費者連接或消息在隊列中一直未被消費的過期時間
b、DLE:過期的消息通過綁定的死信交換機,路由到指定的死信隊列,消費者實際上消費的是死信隊列上的消息
3)缺點:
a、配置麻煩,額外增加一個死信交換機和一個死信隊列的配置
b、脆弱性,配置錯誤或者生產者消費者連接的隊列錯誤都有可能造成延遲失效
2、RocketMQ
1)簡介:來源于阿里,目前為Apache頂級開源項目,使用Java編寫,基于長輪詢的拉取方式,支持事務消息,并解決了順序消息和海量堆積的問題
a、Broker:存放Topic并根據讀取Producer的提交日志,將邏輯上的一個Topic分多個Queue存儲,每個Queue上存儲消息在提交日志上的位置
b、Name Server:無狀態的節點,維護Topic與Broker的對應關系以及Broker的主從關系
2)延遲隊列實現:RocketMQ發送延時消息時先把消息按照延遲時間段發送到指定的隊列中(rocketmq把每種延遲時間段的消息都存放到同一個隊列中),然后通過一個定時器進行輪訓這些隊列,查看消息是否到期,如果到期就把這個消息發送到指定topic的隊列中
3)缺點:延遲時間粒度受限制(1s/5s/10s/30s/1m/2m/3m/4m/5m/6m/7m/8m/9m/10m/20m/30m/1h/2h)
3、Kafka
1)簡介:來源于Linkedin,目前為Apache頂級開源項目,使用Scala和Java編寫,基于zookeeper協調的分布式、流處理的日志系統,升級版為Jafka
2)延遲隊列實現:Kafka支持延時生產、延時拉取、延時刪除等,其基于時間輪和JDK的DelayQueue實現
a、時間輪(TimingWheel):是一個存儲定時任務的環形隊列,底層采用數組實現,數組中的每個元素可以存放一個定時任務列表
b、定時任務列表(TimerTaskList):是一個環形的雙向鏈表,鏈表中的每一項表示的都是定時任務項
c、定時任務項(TimerTaskEntry):封裝了真正的定時任務TimerTask
d、層級時間輪:當任務的到期時間超過了當前時間輪所表示的時間范圍時,就會嘗試添加到上層時間輪中,類似于鐘表就是一個三級時間輪
e、JDK DelayQueue:存儲TimerTaskList,并根據其expiration來推進時間輪的時間,每推進一次除執行相應任務列表外,層級時間輪也會進行相應調整
3)缺點:
a、延遲精度取決于時間格設置
b、延遲任務除由超時觸發還可能被外部事件觸發而執行
4、ActiveMQ
1)簡介:基于JMS協議,Java編寫的Apache頂級開源項目,支持點對點和發布訂閱兩種模式。
a、點對點(point-to-point):消息發送到指定的隊列,每條消息只有一個消費者能夠消費,基于拉模型
b、發布訂閱(publish/subscribe):消息發送到主題Topic上,每條消息會被訂閱該Topic的所有消費者各自消費,基于推模型
2)延遲隊列實現:需要延遲的消息會先存儲在JobStore中,通過異步線程任務JobScheduler將到達投遞時間的消息投遞到相應隊列上
a、Broker Filter:Broker中定義了一系列BrokerFilter的子類構成攔截器鏈,按順序對消息進行相應處理
b、ScheduleBroker:當消息中指定了延遲相關屬性,并且jobId為空時,會生成調度任務存儲到JobStore中,此時消息不會進入到隊列
c、JobStore:基于BTree存儲,key為任務執行的時間戳,value為該時間戳下需要執行的任務列表
d、JobScheduler:取JobStore中最小的key執行(調度時間最早的),執行時間=當前時間,將該任務列表依次投遞到所屬的隊列,對于需要重復投遞和投遞失敗的會再次存入JobStore中。
注: 此處JobScheduler的執行時間間隔可動態變化,默認0.5s,有新任務時會立即執行(Object-notifyAll())并設置時間間隔為0.1s,沒有新任務后,下次執行時間為最近任務的調度執行時間。
3)缺點:投遞到隊列失敗,將消息重新存入JobStore,消息調度執行時間=系統當前時間+延遲時間,會導致消息被真實投遞的時間可能為設置的延遲時間的整數倍
5、Redis
1)簡介:基于Key-Value的NoSQL數據庫,由于其極高的性能常被當作緩存來使用,其數據結構支持:字符串、哈希、列表、集合、有序集合
2)延遲隊列實現:Redis的延遲隊列基于有序集合,score為執行時間戳,value為任務實體或任務實體引用
3)缺點:
a、實現復雜,本身不支持
b、完全基于內存,延遲時間長浪費內存資源
6、消息隊列對比
1、公開課延遲隊列技術選型
1)業務場景:關閉超時未支付訂單、限時優惠活動、拼團
2)性能要求:訂單、活動、拼團 數據量可控,上述MQ均能滿足要求
3)可靠性:使用ActiveMQ、RabbitMQ、RocketMQ作為延遲隊列更普遍
4)可用性:ActiveMQ、RocketMQ自身支持延遲隊列功能,且目前公開課業務中使用的中間件為ActiveMQ和Kafka
5)延遲時間靈活:活動的開始和結束時間比較靈活,而RocketMQ時間粒度較粗,Kafka會依賴時間格有精度缺失
結論: 最終選擇ActiveMQ來作為延遲隊列
2、業務場景:關閉未支付訂單
1)關閉微信未支付訂單
2)關閉IOS未支付訂單
3、ActiveMQ使用方式
1)activemq.xml中支持調度任務
2)發送消息時,設置message的延遲屬性
其中:
a、延遲處理
AMQ_SCHEDULED_DELAY:設置多長時間后,投遞給消費者(毫秒)
b、重復投遞
AMQ_SCHEDULED_PERIOD:重復投遞時間間隔(毫秒)
AMQ_SCHEDULED_REPEAT:重復投遞次數
c、指定調度計劃
AMQ_SCHEDULED_CRON:corn正則表達式
4、公開課使用中進行的優化
1)可靠性:針對實際投遞時間可能翻倍的問題,結合ActiveMQ的重復投遞,在消費者邏輯中做冪等處理來保證延遲時間的準確性
2)可追溯性:延遲消息及消費情況做數據庫冗余存儲
3)易用性:業務上定義好延遲枚舉類型,直接使用JmsDelayTemplate發送,無需關心數據備份和參數等細節
1、無論是基于死信隊列還是基于數據先存儲后投遞,本質上都是將延遲待發送的消息數據與正常訂閱的隊列分開存儲,從而降低耦合度
2、無論是檢查隊頭消息TTL還是調度存儲的延遲數據,本質上都是通過定時任務來完成的,但是定時任務的觸發策略以及延遲數據的存儲方式決定了不同中間件之間的性能優劣
張浩,2018年加入網易傳媒,高級Java開發工程師,目前在網易公開課主要做支付財務體系、版本迭代相關的工作。
為了大家更容易理解我舉出的SQL語句,本文假定已經建立了一個學生成績管理數據庫,全文均以學生成績的管理為例來描述。
1.在查詢結果中顯示列名:
a.用as關鍵字:select name as '姓名' from students order by age
b.直接表示:select name '姓名' from students order by age
2.精確查找:
a.用in限定范圍:select * from students where native in ('湖南', '四川')
b.betweenand:select * from students where age between 20 and 30
c.“=”:select * from students where name = '李山'
d.like:select * from students where name like '李%' (注意查詢條件中有“%”,則說明是部分匹配,而且還有先后信息在里面,即查找以“李”開頭的匹配項。所以若查詢有“李”的所有對象,應該命令:'%李%';若是第二個字為李,則應為'_李%'或'_李'或'_李_'。)
e.[]匹配檢查符:select * from courses where cno like '[AC]%' (表示或的關系,與"in()"類似,而且"[]"可以表示范圍,如:select * from courses where cno like '[A-C]%')
3.對于時間類型變量的處理
a.smalldatetime:直接按照字符串處理的方式進行處理,例如:
select * from students where birth = '1980-1-1' and birth = '1980-12-31'
4.集函數
a.count()求和,如:select count(*) from students (求學生總人數)
b.avg(列)求平均,如:select avg(mark) from grades where cno=’B2’
c.max(列)和min(列),求最大與最小
5.分組group
常用于統計時,如分組查總數:
select gender,count(sno)
from students
group by gender
查看男女學生各有多少)
注意:從哪種角度分組就從哪列"group by"
對于多重分組,只需將分組規則羅列。比如查詢各屆各專業的男女同學人數,那么分組規則有:屆別(grade)、專業(mno)和性別(gender),所以有"group by grade, mno, gender"select grade, mno, gender, count(*)
from students
group by grade, mno, gender
通常group還和having聯用,比如查詢1門課以上不及格的學生,則按學號(sno)分類有:
select sno,count(*) from grades
where mark60
group by sno
having count(*)1
6.UNION聯合
并查詢結果,如:
SELECT * FROM students
WHERE name like ‘張%’
UNION [ALL]
SELECT * FROM students
WHERE name like ‘李%’
7.多表查詢
a.內連接
select g.sno,s.name,c.coursename
from grades g JOIN students s ON g.sno=s.sno
JOIN courses c ON g.cno=c.cno
(注意可以引用別名)
b.外連接
b1.左連接
select courses.cno,max(coursename),count(sno)
from courses LEFT JOIN grades ON courses.cno=grades.cno
group by courses.cno
左連接特點:顯示全部左邊表中的所有項目,即使其中有些項中的數據未填寫完全。
左外連接返回那些存在于左表而右表中卻沒有的行,再加上內連接的行。
b2.右連接
與左連接類似
b3.全連接
select sno,name,major
from students FULL JOIN majors ON students.mno=majors.mno
兩邊表中的內容全部顯示
c.自身連接
select c1.cno,c1.coursename,c1.pno,c2.coursename
from courses c1,courses c2 where c1.pno=c2.cno
采用別名解決問題。
d.交叉連接
select lastname+firstname from lastname CROSS JOIN firstanme
相當于做笛卡兒積
8.嵌套查詢
a.用關鍵字IN,如查詢李山的同鄉:
select * from students
where native in (select native from students where name=’ 李山’)
b.使用關鍵字EXIST,比如,下面兩句是等價的:
select * from students
where sno in (select sno from grades where cno=’B2’)
select * from students where exists
(select * from grades where
grades.sno=students.sno AND cno=’B2’)
9.關于排序order
a.對于排序order,有兩種方法:asc升序和desc降序
b.對于排序order,可以按照查詢條件中的某項排列,而且這項可用數字表示,如:
select sno,count(*) ,avg(mark) from grades
group by sno
having avg(mark)85
order by 3
10.其他
a.對于有空格的識別名稱,應該用"[]"括住。
b.對于某列中沒有數據的特定查詢可以用null判斷,如select sno,courseno from grades where mark IS NULL
c.注意區分在嵌套查詢中使用的any與all的區別,any相當于邏輯運算“||”而all則相當于邏輯運算“”
d.注意在做否定意義的查詢是小心進入陷阱:
如,沒有選修‘B2’課程的學生 :
select students.*
from students, grades
where students.sno=grades.sno
AND grades.cno ’B2’
上面的查詢方式是錯誤的,正確方式見下方:
select * from students
where not exists (select * from grades
where grades.sno=students.sno AND cno='B2')
11.關于有難度多重嵌套查詢的解決思想:
如,選修了全部課程的學生:
select *
from students
where not exists ( select *
from courses
where NOT EXISTS
(select *
from grades
where sno=students.sno
AND cno=courses.cno))
最外一重:從學生表中選,排除那些有課沒選的。用not exist。由于討論對象是課程,所以第二重查詢從course表中找,排除那些選了課的即可。
要求學生學習并掌握現代計算機信息系統所必備的基礎理論、專業知識、主要的實現手段。具有比較熟練的數據庫應用,信息系統管理技能,并能進行基本的信息系統工程中的需求研究、開發與維護。 二. 專業方向 1.微軟SQL SERVER方向/ORACLE方向 2.信息管理方向 3.財務信息管理方向 三. 具體介紹 (一)微軟SQL SERVER方向 這個方向是和微軟ATA聯合辦學,參加微軟考證,課程考試合格,可以獲取微軟的MCDBA認證證書。 1. 知識能力結構 (1) 具有熟練應用和操作計算機的能力。 (2) 具有較好的英語聽、閱讀能力及簡單的寫作能力。 (3) 熟悉.NET框架平臺,熟練基于.NET框架的程序開發。 (4) 熟練掌握SQL Server數據庫,能夠對數據庫進行各種操作。 (5) 掌握計算機網絡基本概念,掌握局域網的組建與管理技術,熟練掌握網絡操作系統的使用。 2. 就業方向: (1) 各企業事業單位勞動、人事、檔案、財務管理、電子商務及辦公自動化。 (2) 企業ERP系統的開發、實施與維護。 (3)網絡組建運行維護、信息管理及數據庫建設。 (4)企業電子商務的實施與系統維護 3. 主要課程介紹 (1)SQL Server 2000 設計與應用 主要講授數據庫技術的基本概念,數據模型和關系數據庫模型,關系數據庫設計理論,SQLserver數據庫設計,數據查詢,高級SQL語言查詢,存儲過程,應用數據庫設計。 (2) ADO.NET 程序設計 操縱數據庫是編寫應用程序的重要環節,單獨開設一門課程講解如何編寫高效、安全、穩定的面向數據的應用程序。 (3)基于.NET 的Web 應用程序設計 介紹設計基于.NET 的Web 應用程序的基本概念,方法和相關配置,是本專業重要的課程。 4. 實踐訓練課程 SQL SERVER程序設計實訓、ASP.NET課程實訓、畢業綜合實訓。 (二)ORACLE方向 這個方向是和ORACLE聯合辦學,參加ORACLE考證,課程考試合格,可以獲取ORACLE的數據庫工程師證書。 1.知識能力結構 (1) 具有熟練應用和操作計算機的能力。 (2) 具有較好的英語聽、閱讀能力及簡單的寫作能力。 (3) 熟悉ORACLE框架平臺,熟練基于ORACLE框架的程序開發。 (4) 熟練掌握SQL Server數據庫,能夠對數據庫進行各種操作。 (5) 掌握計算機網絡基本概念,掌握局域網的組建與管理技術,熟練掌握網絡操作系統的使用。 2.就業方向: (1) 各企業事業單位勞動、人事、檔案、財務管理、電子商務及辦公自動化。 (2) 軟件程序的設計、開發、調試與維護。 (3) 金融證券行情接收、分析、交易,人口、工業、農業等普查。 (4) 工業生產過程自動化控制、農業大棚管理、環境監測、天文計算等。 (5) 網絡組建運行維護、信息管理及數據庫建設。 3.主要課程介紹 (1)ORACLE 數據庫及應用 本課程主要介紹ORACLE數據的使用,其中包括SQL語言的基礎基本數據定義、數據操作語句。
金融領域七大數據科學應用實踐案例
近年來,數據科學和機器學習應對一系列主要金融任務的能力已成為一個特別重要的問題。 公司希望知道更多技術帶來的改進以及他們如何重塑業務戰略。
為了幫助您回答這些問題,我們準備了一份對金融行業影響最大的數據科學應用清單。 它們涵蓋了從數據管理到交易策略的各種業務方面,但它們的共同點是增強金融解決方案的巨大前景。
自動化風險管理
風險管理是金融機構極其重要的領域, 負責公司的安全性,可信度和戰略決策 。 過去幾年來,處理風險管理的方法發生了重大變化,改變了金融部門的性質。 從未像現在這樣,今天的機器學習模型定義了業務發展的載體。
風險可以來自很多來源,例如競爭對手,投資者,監管機構或公司的客戶。 此外,風險的重要性和潛在損失可能不同。 因此,**主要步驟是識別,優先考慮和監控風險,這是機器學習的完美任務。 **通過對大量客戶數據,金融借貸和保險結果的訓練,算法不僅可以增強風險評分模型,還可以提高成本效率和可持續性。
數據科學和人工智能(AI)在風險管理中最重要的應用是識別潛在客戶的信譽。 為了為特定客戶建立適當的信用額度,公司使用機器學習算法來分析過去的支出行為和模式。 這種方法在與新客戶或具有簡短信用記錄的客戶合作時也很有用。
雖然金融風險管理流程的數字化和自動化處于早期階段,但潛力巨大。 金融機構仍需要為變革做好準備,這種變革通過實現核心財務流程的自動化,提高財務團隊的分析能力以及進行戰略性技術投資。 但只要公司開始向這個方向發展,利潤就不會讓自己等待。
管理客戶數據
對于金融公司來說,數據是最重要的資源。因此,高效的數據管理是企業成功的關鍵。今天,在結構和數量上存在大量的金融數據:從社交媒體活動和移動互動到市場數據和交易細節。金融專家經常需要處理半結構化或非結構化數據,手動處理這些數據是一個巨大的挑戰。
然而,對于大多數公司來說,將機器學習技術與管理過程集成僅僅是從數據中提取真實知識的必要條件。**人工智能工具,特別是自然語言處理,數據挖掘和文本分析有助于將數據轉化為智能數據治理和更好的業務解決方案,從而提高盈利能力。**例如,機器學習算法可以通過向客戶學習財務歷史數據來分析某些特定財務趨勢和市場發展的影響。最后,這些技術可用于生成自動報告。
預測分析
分析現在是金融服務的核心。 值得特別關注的是預測分析,它揭示了預測未來事件的數據模式,可以立即采取行動。 通過了解社交媒體,新聞趨勢和其他數據源,這些復雜的分析方法已經實現了預測價格和客戶終生價值,未來生活事件,預期流失率和股市走勢等主要應用。 最重要的是,這種技術可以幫助回答復雜的問題 - 如何最好地介入。
實時分析
實時分析通過分析來自不同來源的大量數據從根本上改變財務流程,并快速識別任何變化并找到對其的最佳反應。財務實時分析應用有三個主要方向:
欺詐識別
**金融公司有義務保證其用戶的最高安全級別。**公司面臨的主要挑戰是找到一個很好的欺詐檢測系統,罪犯總是會采用新的方法并設置新的陷阱。**只有稱職的數據科學家才能創建完美的算法來檢測和預防用戶行為異常或正在進行的各種欺詐工作流程。**例如,針對特定用戶的不尋常金融購買警報或大量現金提款將導致阻止這些操作,直到客戶確認為止。在股票市場中,機器學習工具可以識別交易數據中的模式,這可能會指示操縱并提醒員工進行調查。然而,這種算法最大的優勢在于自我教學的能力,隨著時間的推移變得越來越有效和智能化。
消費者分析
實時分析還有助于更好地了解客戶和有效的個性化。先進的機器學習算法和客戶情緒分析技術可以從客戶行為,社交媒體互動,他們的反饋和意見中獲得見解,并改善個性化并提高利潤。由于數據量巨大,只有經驗豐富的數據科學家才能精確分解。
算法交易
這個領域可能受實時分析的影響最大,因為每秒都會受到影響。根據分析傳統和非傳統數據的最新信息,金融機構可以做出實時有利的決策。而且由于這些數據通常只在短時間內才有價值,因此在這個領域具有競爭力意味著使用最快的方法分析數據。
在此領域結合實時和預測分析時,另一個預期會開啟。過去,金融公司不得不聘用能夠開發統計模型并使用歷史數據來創建預測市場機會的交易算法的數學家。然而,今天人工智能提供了使這一過程更快的技術,而且特別重要的是 - 不斷改進。
因此, 數據科學和人工智能在交易領域進行了革命,啟動了算法交易策略。 世界上大多數交易所都使用計算機,根據算法和正確策略制定決策,并考慮到新數據。 人工智能無限處理大量信息,包括推文,財務指標,新聞和書籍數據,甚至電視節目。 因此,它理解當今的全球趨勢并不斷提高對金融市場的預測。
總而言之,實時和預測分析顯著改變了不同金融領域的狀況。 通過hadoop,NoSQL和Storm等技術,傳統和非傳統數據集以及最精確的算法,數據工程師正在改變財務用于工作的方式。
深度個性化和定制
企業認識到,在當今市場競爭的關鍵步驟之一是通過與客戶建立高質量的個性化關系來提高參與度。 這個想法是分析數字客戶體驗,并根據客戶的興趣和偏好對其進行修改。 人工智能在理解人類語言和情感方面取得重大進展,從而將客戶個性化提升到一個全新的水平。 數據工程師還可以建立模型,研究消費者的行為并發現客戶需要財務建議的情況。 預測分析工具和高級數字交付選項的結合可以幫助完成這項復雜的任務,在最恰當的時機指導客戶獲得最佳財務解決方案,并根據消費習慣,社交人口趨勢,位置和其他偏好建議個性化服務。
結論
對于金融機構來說,數據科學技術的使用提供了一個從競爭中脫穎而出并重塑其業務的巨大機會。大量不斷變化的財務數據造成了將機器學習和AI工具引入業務不同方面的必要性。
我們認為,我們主要關注金融領域的7大數據科學用例,但還有很多其他值得一提的。 如果您有任何進一步的想法,請在評論部分分享您的想法。
本文名稱:nosql的實踐報告,nosql實訓總結
分享網址:http://vcdvsql.cn/article42/dsijoec.html
成都網站建設公司_創新互聯,為您提供手機網站建設、動態網站、網站排名、網站建設、定制開發、電子商務
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯