很多事情真是说起来容易做起来难,就比如说起来很简单的:
> 把mysql的数据同步到elasticsearch里
听着很简单吧,我们有各种现成的工具,之前调研了半天,选择了elasticsearch
jdbc这种类似river的工具,根据数据表里的update_time来做数据同步。将lastexecutionstart作为时间参数传到sql里,构成了下面这样的sql
select *, id as _id from [业务表] where update_time > ?
? = lastexecutionstart
看着是不是挺天衣无缝的?
如果真的这么顺利就好了。。。。
实际操作的时候发现了很多问题:
首先,我们的代码里没有在创建数据条目的时候填update_time,我&$@#$$(@#)*$。
而这种”显然我就不遵守既定的常识“的事情在我现在参与的这个系统里尤其的多。这种我觉得还是规范的问题,
本文是官方Transactions小节的文档翻译,因为之前对redis的事务一直比较疑惑,这里做一次记录:
MULTI,EXEC,DISCARD和WATCH是redis里构成事务的4个基础命令。通过redis的事务,可以做到一次执行一组命令,关于事务redis有两方面的保证:
1. 在一个事务中的所有命令会被串行化并且是按照顺序依次执行。在事务执行期间一定不会被插入其它客户端传入的命令。这一点保证了这些命令是一个独立的执行体(独立性)。
2. 所有的命令要么全部被执行,要么没有一条被执行,所以一个redis的事务同样也具有原子性。EXEC这个命令会触发事务中所有的命令开始执行,所以在客户端在执行了MULTI命令之后(
官方这里写的是之前,但是我觉得不对
)的事务上下文中丢生了和服务器的连接,那么任何一条命令都不会被执行,但如果EXEC已经开始执行了的话,所有的命令都会被执行完。当使用append-only
文件作为Redis的持久化方式时,Redis会确保用write的系统调用来将事务写到磁盘上。然而如果Redis服务器在保存过程中崩
这几年O2O火爆,10个创业公司里就有9个是O2O的电商,相信支付抢购什么的以前听起来高大上的东西现在很多码农都会需要自己去实现。
说到支付,就一定会涉及到事务。说到事务,肯定很多码农泪千行。
在原来的数据库单机时代,你写一个事务并没有什么关系,我的支付逻辑涉及的所有表可能都在同一个数据库里,MySQL原生支持这些东西,学校里的老师也会跟你讲,事务是保证数据完整性的重要手段。
然而到了SOA时代,网站服务化,可能你的账户表和流水表都不在一个数据库里了(只是举例,不要太较真)。这种时候就有了分布式事务的概念。然后就有了各种二阶段提交,分布式CAP的取舍,基于消息队列实现的分布式事务等等等等。
扯远了,本文并不是想讲这些东西。
在大厨工作的时候听同事介绍过乐观锁这个概念,一开始以为是Java还是什么语言的语言特性,后来发现其实是一种写入、更新数据库时的逻辑特性。。
具体是这样的:
1.在需要加乐观锁的表中加入version字段
2.update时,
上一篇讲到了ES的river数据导入,但是看起来这么简单的流程也还是有一些坑,比如在我导入我司的一个3kw表内容时就碰到了整个虚拟机都卡住,几乎无法登陆的问题。
因为es和river插件都是用java写的,这种时候感觉就有点手足无措。但是在es的日志里发现了频繁GC的信息。每次垃圾回收都会持续很长时间。这种现象在Java界还有一个很有意思的称谓:
> Stop the world
援引一下别人的说明:
Stop the world 机制简称STW,即,在执行垃圾收集算法时,Java应用程序的其他所有除了垃圾收集帮助器线程之外的线程都被挂起
说起STW,只要有GC的语言都会遇到这个问题。Go在1.5之前的GC也是一直为人所诟病,而且像STW这种情况就更严重了啊,整个一台机器直接就没办法向外提供服务了。之前看到360和小米工程师在go语言早期GC不给力的时候怎么解决这种问题呢~靠重启。。你没看错,就是靠重启。
再说到前面的问题,我们只看STW的描述的话会发现:额,
这两个概念其实很早之前就听说了,近一年也一直在查找相关的资料。并且有意无意地读了一些相关的书籍。
前几天在《程序员的呐喊》里看到亚马逊在2002年的时候,是贝索斯突然向公司程序员们发出以下指令:
1.从今天起,所有的团队都要以服务接口的方式提供数据和各种功能。
2.团队之间必须通过接口来通信。
3.不允许任何其他形式的互操作:不允许直接链接,不允许直接读其他团队的数据,不允许共享内存,不允许任何形式的后门。唯一许可的通信方式就是通过网络调用服务。
4.至于具体的技术不做规定。HTTP、Corba、Pubsub、自定义协议都可以,贝索斯不关心这个。
5.所有的服务接口,必须从一开始就要以可以公开为设计导向,没有例外。这就是说,团队必须在设计的时候就计划好,接口要可以对外面的开发人员开放,