<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> </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> </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> </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">架构&设计</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>