利用redis實現elasticsearch入庫去重

<article id="post-3170" class="post-3170 post type-post status-publish format-standard hentry category-12">redis

<div class="entry-content">
		<h1></h1>

<p><span id="more-3170"></span></p> <h1>背景</h1> <p>公司有一個業務場景,數據庫的修改須要同步到Elasticsearch裏,可是該場景的修改頻率有點高,常常會出現一條記錄短期內屢次的變化,若是每次變化都做爲一次ES同步任務,那ES確定是受不住的。</p> <h1>思路</h1> <p>經過估算請求規模,主要有以下2方面的解決思路:</p> <ul> <li>高頻變化去重:由於同一條記錄短期內屢次變化,其實同步一次最終的狀態便可,因此能夠考慮犧牲必定的實時性,在必定時間窗口內作變化通知的去重。</li> <li>批量導入:每條記錄變化做爲獨立請求推送給ES,實際上遠不如多條記錄批量推送ES的吞吐要高。</li> </ul> <h1>方案</h1> <ul> <li>在線去重:由於在線業務自己是高頻的,因此須要一個高頻的存儲介質來實現去重,想到redis的set/zset數據結構。</li> <li>離線批量:利用離線JOB定時的將一段時間內去重的變更集合推送給ES,其核心問題在於在線set集合如何離線化,保證互不影響。</li> </ul> <p>&nbsp;</p> <p>總體架構以下:</p> <p><img class="alignnone size-full wp-image-3173" src="http://yuerblog.cc/wp-content/uploads/2018/05/2D1F92F3-F7FA-405B-9F5D-70FF60DBC89A.png" alt="" width="436" height="293" srcset="https://yuerblog.cc/wp-content/uploads/2018/05/2D1F92F3-F7FA-405B-9F5D-70FF60DBC89A.png 436w, https://yuerblog.cc/wp-content/uploads/2018/05/2D1F92F3-F7FA-405B-9F5D-70FF60DBC89A-300x202.png 300w" sizes="(max-width: 436px) 100vw, 436px"></p> <p>&nbsp;</p> <p>假設變更的是用戶的積分等高頻資產信息,那麼在線部分一旦數據庫發生變更,則將用戶uid向zset_w在線集合寫入,能夠實現實時去重。</p> <p>離線JOB則首先檢查zset_r離線集合是否有剩餘變更任務未處理,若zset_r集合爲空則執行redis的rename操做將在線集合zset_w重命名爲zset_r,這個過程對redis來講是原子性的。</p> <p>此後離線JOB繼續處理zset_r中已經去重的變化uid集合,而在線部分繼續向新的zset_w集合添加最新變更的uid便可,如此往復。</p> <h1>優化</h1> <p>隨着在線高頻變動量的增多,該方案能夠實施橫向擴展,即準備N對(zset_w、zset_r)並令在線部分按uid打散流量,從而能夠爲每一對zset啓動獨立的離線JOB,實現並行處理。</p> <p>鑑於在線部分操做redis異常致使通知丟失,能夠經過長週期的全庫離線補償實現,在此不作說明。</p> <h1>結論</h1> <p>該業務場景的思想本質包含了2點:</p> <ul> <li>流式轉批量 換取更高的吞吐。</li> <li>大問題拆小 實現橫向的擴展。</li> </ul> <p>老是思考是否有更簡單的方案,作到簡單可依賴。</p> <p>&nbsp;</p> </div><!-- .entry-content -->數據庫

<footer class="entry-meta">
		本條目發佈於<a href="https://yuerblog.cc/2018/05/25/%e5%88%a9%e7%94%a8redis%e5%ae%9e%e7%8e%b0elasticsearch%e5%85%a5%e5%ba%93%e5%8e%bb%e9%87%8d/" title="下午1:54" rel="bookmark"><time class="entry-date" datetime="2018-05-25T13:54:44+08:00">2018年5月25日</time></a>。屬於<a href="https://yuerblog.cc/category/%e6%9e%b6%e6%9e%84%e8%ae%be%e8%ae%a1/" rel="category tag">架構&amp;設計</a>分類。<span class="by-author">做者是<span class="author vcard"><a class="url fn n" href="https://yuerblog.cc/author/yuer/" title="查看全部由yuer發佈的文章" rel="author">yuer</a></span>。</span>								</footer><!-- .entry-meta -->
</article>
相關文章
相關標籤/搜索