2017上海QCon之旅总结(上)
本来这个公众号的交流消息中间件相关的技术的。这周去上海参加了QCon,第一次参加这样的技术会议,感受挺多的,所以整理一下自己的一些想法接公众号和大家交流一下。
下面进入正题,从自己参加了的一些分享中挑一些有趣的议题来和大家讨论。
《“深蓝”20年之后的人工智能》
2017年可以说是人工智能的元年了,AlphaGo战胜李世石然人工智能一下进入了大众的视野。之后以Master的身份60连胜,接着战胜长期世界排名第一的柯洁,QCon期间AlphaGo Zero通过3天自学的方式就以100:0的方式战胜了AlphaGo,可以说在棋类领域人类对人工智能已经没有任何胜算了。
这次QCon,复旦大学的危辉教授从人工智能的历史说起,之后从人工智能的问题域、解题步骤步步深入,清晰的描述了目前人工智能领域的进展。
危辉教授的《“深蓝”20年之后的人工智能》分享可能从听众的感受上有点“反”人工智能热潮,但是我认为这场分享是给人工智能的门外的我们一个很好的入门介绍,让我们明白目前人工智能领域的发展状况,让我们对遍地的人工智能现象有一个清晰的任务。
另外危辉教授演讲的逻辑性、严谨性和现场把控能力,真的是单从一场分享能感受到功底的深厚。
这场分享的PPT没能从QCon网站上下载到,并不能回忆起很多具体的分享内容,以上是个人现场感受的一些体验。
《免费的性能午餐——Alibaba JDK协程》
这一场是阿里巴巴技术专家郁磊带来关于Alibaba JDK协程的介绍。
在参加这次分享之前,我对协程并没有什么概念(没写过C++程序)。这场分享下来只能说有个简单的认识,另外就是感叹于阿里的同学在这块技术领域的深入。
不过就目前的状况,对我们这样一些小公司而言,可能并没有技术能力去修改JVM,短期内的编程方式并不会有太大的改变。可能当协程成为一种标准,一种官方提倡的编程方式之后才会慢慢进入大众程序员的领域(那为什么不提前学习一些呢?)。
《基于内存的分布式计算》
这是这次QCon去听的第一个具体问题领域的解决方案。
包含内容如下:
- 背景介绍及问题阐述
- 候选解决方案分析
- 分布式内存计算框架介绍
- 客户实践
这里我简要的说一下第1点和第3点。
问题背景
Talking Data技术团队使用bitmap索引技术移动运营各项指标(如日活、留存)的实时计算,因为bitmap索引高效且能节省存储空间,它能很方便地做指标的实时排重。
上面是日活的一个例子,其实就是用一个二进制位来保存用户的状态。比如第一位表示用户设备1,该位为0表示用户未登录过,为1表示用户登录过。那么用户重复的登录自然就被忽略了。
Talking Data使用MySQL的blob类型存储bitmap数据,那么每次需要更新数据时,如需要更新某一个用户的状态,那么需要将bitmap读取出来,修改其中一位,之后将数据写回到MySQL中。那么就带来了一个问题,当某个APP的日活数据量特别大时,bitmap数据特别大,频繁的update导致了产生大量的MySQL binlog。
解决方案
大概思路就是在MySQL之前加上一层缓存,前端的更新操作都在Blade内存中操作,之后定时同步写到MySQL中,这样就解决了频繁更新bitmap导致的大量binlog问题。
几个组件如上图:
- APP中使用的Client
- 内存计算服务Blade Server(分为Master和Slave)
- Blade Data Sync负责从Server定时同步数据到MySQL
- Blade Admin提供管控功能
上图中Blade Server有主备关系,且主备间有交互。
现场提问环节,我提了以下几个问题:
- 主从复制是怎么做的、支持一主多从吗?
- Blade Server是基于内存的,没有做持久化,那么可么保证系统的可靠性,比如如果主从两个节点宕机了,未同步到MySQL的数据是否就丢失了?
得到的答复是目前他们并没有做主从复制,当前其实是双写的模式,即Client会将数据写到Master和Slave。这样也就没有第二个问题的处理了。
对于分布式系统,认为首先要考虑的就是系统的可靠性和可用性。
我们常常说的一点就是为了保证数据的可靠性,我们需要一式三份,而且是尽量让三分数据分不到不同机器中,比如同机柜的机器存一份,跨机柜的存一份,像HDFS那样存储数据。
所以我觉得上面的方案并不是一个很可靠的方案。
比如使用消息中间件的方式是否能代替上面的方案呢?
客户端将消息发送到消息中间件中,类似于RocketMQ和Kafka这样的组件中,之后通过Consumer定时从中取消费数据来解决频繁更新的问题(数据的可靠性通过消息中间件得到了保证)。
也可启动实时消费的Consumer来消费数据更新到某个内存服务中,这样可以提供实时的查询服务。
以上是自己的一些疑问和拍脑袋的一个替代方案,欢迎交流不同的想法。
《饿了么异地多活的基础设施建设》
之前我们团队考虑过一些异地多活的实现方案,所以特地去听了这场分享。
之前在自己考虑异地多活方案时,遇到的最大的问题是数据同步和数据一致性。
下面看饿了么是如何实现基地多活的。
首先是饿了么的业务特点:
其中最重要的一点就是地域性。
饿了么的业务特点,可以将所有数据按照商户所在的位置信息来进行划分。
比如所有南方商户的数据走上海机房,所有北方商户的数据走北京机房。对于用户和订单信息,都可以关联到对应的商家,然后访问商家对应所在的机房的服务。
上面是饿了么异地多活的数据复制实现。思路就是在两个机房之间进行双向的数据复制。
回想一下,因为饿了么的业务特点,双向复制的数据中不会有重叠的部分。
- 从北京机房往上海机房复制的是北方商户的数据
- 从上海机房到北京机房复制的是南方商户的数据
- 在复制中过滤掉不必要的数据,比如从上海复制到北京的数据,这部分数据应用到MySQL之后也会产生binlog,这部分binlog需要从北京复制到上海的数据中剔除(这个通过改造SQL或者增加标识是可以做到的)
这样就避免掉了一个数据在两个机房同时被修改的问题。
扩展
考虑一个问题,比如在电商场景中做异地多活。
对于一个商品,在北京机房和上海机房都会被访问,这个时候就产生了一个问题:
- 商品的库存为1,北京机房下了一单,将商品库存变更为0;同时上海机房也下了一单,也将库存变更为0。这样就产生了超卖的问题。
- 另外,如何在双向数据同步中将上线的数据修复,即使其中一个订单失效,将库存修复也会一个问题。
Otter
阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter这样一个产品。
Otter在解决数据一致性问题时(同一行记录多地修改),有两种方案:
- 事前控制:比如paoxs协议,在多地数据写入各自数据存储之前,就已经决定好最后保留哪条记录
- 事后补救:指A/B两地修改的数据,已经保存到数据库之后,通过数据同步后保证两数据的一致性
两种方式都是数据最终一致性的保证,具体内容可以参考:Otter数据一致性解决方案
未完待续...
QCon3天,还有挺多想和大家分享的,所以还有下篇,包含《PhxQueue——微信开源高可用强一致分布式队列的设计与实现》、《Heron的Exactly-Once实现》几个议题的分享感受。
欢迎关注公众号交流。
2017QCon上海站PPT下载:PPT
2017上海QCon之旅总结(上)的更多相关文章
- 2017上海QCon之旅总结(下)
本来这个公众号的交流消息中间件相关的技术的.十月去上海参加了QCon,第一次参加这样的技术会议,感受挺多的,所以整理一下自己的一些想法接公众号和大家交流一下. 三天的内容还挺多的,之前已经有上篇和中篇 ...
- 2017上海QCon之旅总结(中)
本来这个公众号的交流消息中间件相关的技术的.上周去上海参加了QCon,第一次参加这样的技术会议,感受挺多的,所以整理一下自己的一些想法接公众号和大家交流一下. 三天的内容还挺多的,原计划分上下两篇总结 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用
大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...
- F# 之旅(上)
写在前面的话 解答一下在上一篇文章<在Visual Studio中入门F#>中有人的提问, 1. 问:是准备写 F# 系列吗? 答:当然不是,本人也是刚刚学习 F#,只是翻译微软官方 ...
- 《Github入门与实践》读书笔记 蟲咋先生的追求之旅(上)
<Github入门与实践>作者: [日] 大塚弘记 译者:支鹏浩/刘斌 简介 本书从Git的基本知识和操作方法入手,详细介绍了GitHub的各种功能,GitHub与其他工具或服务的协作 ...
- 2017上海C++面试
今天参加了一次面试,觉得比较有意思,收获蛮多,简单的在这里总结下. 开始做了一道算法题,也就是算术运算表达式中的左括号和右括号的匹配,用c++写.我大概10分钟就写完了.其实以前一直想实现这个功能的, ...
- (转)基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用
http://www.cnblogs.com/wuhuacong/p/3343967.html 大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随 ...
- .NET跨平台之旅:基于.NET Core改写EnyimMemcached,实现Linux上访问memcached缓存
注:支持 .NET Core 的 memcached 客户端 EnyimMemcachedCore 的 NuGet 包下载地址:https://www.nuget.org/packages/Enyim ...
- 北京VS上海:“活着为了工作”还是“工作为了生活”?
Costco开业你去现场了吗?人口普查似的排队场面对于上海人来说已经不稀奇,毕竟当新鲜的商品或是业态来到中国时,上海常常是第一站.但当Costco的新闻不断发酵的同时,在互联网的角落里也有一群人提出了 ...
随机推荐
- 201521123071《java程序设计》第三周学习总结
1. 本周学习总结 这周主要学习了构造函数,类与对象,就是这周事情很多,还没来得及好好复习,所以有很多知识都没有认识透彻.但我会尽力补上的. http://images2015.cnblogs.com ...
- 201521123113 《Java程序设计》第2周学习总结
1.本周学习总结 学习了各种java数据类型以及各种运算符的使用 string类之所以好用是因为这是人可以看得懂的类型,操作简便 Scanner扫描器与标准输出输入用法上的不同,Scanner较标准输 ...
- [01] Java语言的基本认识
0.写在前面的话 我们都知道在计算机的底层,它是识别二进制的,也就是说,计算机只能认识0和1.这主要是因为电路的逻辑只有两种状态,所以只需要0和1两个数字就可以表示低电平和高电平.而计算机是由数不清的 ...
- Hibernate第六篇【多对多映射、一对一映射】
前言 前面已经讲解了一对多和多对一的映射是怎么配置了,也讲解了inverse和cascade属性对关联关系的影响,本博文讲解多对多的映射和一对一的映射! 多对多映射 需求:一个项目由多个员工开发,一个 ...
- Spring - bean的依赖关系(depends-on属性)
depends-on是bean标签的属性之一,表示一个bean对其他bean的依赖关系.乍一想,不是有ref吗?其实还是有区别的,<ref/>标签是一个bean对其他bean的引用,而de ...
- 自定义Django的中间件
分析Django的生命周期,我们知道所有的http请求都要经过Django的中间件. 假如现在有一个需求,所有到达服务端的url请求都在系统中记录一条日志,该怎么做呢? Django的中间件的简介 D ...
- Eclipse dynamic web project 插件
下载了Eclipse Oxygen 发现没有Dynamic web Project 首先我们先了解下Dynamic Web Project If you want to create a c ...
- angular之$watch方法详解
在$apply方法中提到过脏检查,首先apply方法会触发evel方法,当evel方法解析成功后,会去触发digest方法,digest方法会触发watch方法. (1)$watch简介 在diges ...
- 第4章 同步控制 Synchronization ----互斥器(Mutexes)
Win32 的 Mutex 用途和 critical section 非常类似,但是它牺牲速度以增加弹性.或许你已经猜到了,mutex 是 MUTual EXclusion 的缩写.一个时间内只能够有 ...
- Qt全局宏和变量
1. Qt 全局宏定义 Qt版本号: QT_VERSION : (major << 16) + (minor << 8) + patch 检测版本号: QT_VERSION ...