n*1
2 楼
我真没想到还在争12306这个话题,其中一个核心是关于transaction
由于自己的一些经验,我很容易理解好虫的方案,当然可能也是四平八稳,也没什么惊
喜。另外一些人的方案是跳出框架的约束,重新思考问题的本质,将商业逻辑抽象。我
没有能力判断两者的可行和好坏。
我自己也一直没法真正理解transaction这个问题,我尝试去读《Java Transaction
Design Strategies》这本书,但是说实在,我看不懂这本书,虽然很多人说这本书已
经是最好,最容易理解。
似乎从一开始我们接受了关系型数据库天生的解决方案,生来就有外键,需要关联,需
要transaction,没有我们就不知道该怎么办。很多时候我们想优化,都说因为这个那
个约束,最后说是瓶颈,没法解决。我们经常被DBA这样忽悠。
关系型数据库出现的时候,很多人可能都没出生,有时候我们也不知道为什么今天发展
到这个情况
最近我接触了MongoDB,相信现在很多人都接触过了,它就是把传统RDBMS传统一套抛弃
,重新获得解放,在一些情况下非常好用。它目前已经不支持document(类似table)
之间的transaction,意思就是如果你想更新一个表,同时又想更新第二个表的时候,
你不能将两个操作作为All or nothing进行处理。
如果你需要,就只能自己去实现。
它这里解释了怎么用transaction最经典的例子来做解释,只是由A账户转账100到B账户
,怎么实现这个需求。
这里很详细实现了用一个额外的document(table)去记录怎么two phase commit,怎么
rollback
http://docs.mongodb.org/manual/tutorial/perform-two-phase-commi
可以看出来已经很复杂
由于自己的一些经验,我很容易理解好虫的方案,当然可能也是四平八稳,也没什么惊
喜。另外一些人的方案是跳出框架的约束,重新思考问题的本质,将商业逻辑抽象。我
没有能力判断两者的可行和好坏。
我自己也一直没法真正理解transaction这个问题,我尝试去读《Java Transaction
Design Strategies》这本书,但是说实在,我看不懂这本书,虽然很多人说这本书已
经是最好,最容易理解。
似乎从一开始我们接受了关系型数据库天生的解决方案,生来就有外键,需要关联,需
要transaction,没有我们就不知道该怎么办。很多时候我们想优化,都说因为这个那
个约束,最后说是瓶颈,没法解决。我们经常被DBA这样忽悠。
关系型数据库出现的时候,很多人可能都没出生,有时候我们也不知道为什么今天发展
到这个情况
最近我接触了MongoDB,相信现在很多人都接触过了,它就是把传统RDBMS传统一套抛弃
,重新获得解放,在一些情况下非常好用。它目前已经不支持document(类似table)
之间的transaction,意思就是如果你想更新一个表,同时又想更新第二个表的时候,
你不能将两个操作作为All or nothing进行处理。
如果你需要,就只能自己去实现。
它这里解释了怎么用transaction最经典的例子来做解释,只是由A账户转账100到B账户
,怎么实现这个需求。
这里很详细实现了用一个额外的document(table)去记录怎么two phase commit,怎么
rollback
http://docs.mongodb.org/manual/tutorial/perform-two-phase-commi
可以看出来已经很复杂
z*e
4 楼
少来
mongodb是nosql里面最像db的一个
可以说就是因为很多人离不开db
所以才选择了mongo
否则谁用?
我就不用,我要db的时候用postgresql
不需要的时候用cassandra
mongodb是nosql里面最像db的一个
可以说就是因为很多人离不开db
所以才选择了mongo
否则谁用?
我就不用,我要db的时候用postgresql
不需要的时候用cassandra
z*e
6 楼
transaction因为太耗性能
而且无法scale out,所以才被提起
而要scale out自然会有所牺牲
这个牺牲往往就是数据的精度
当你的业务不涉及钱的时候
比如搜索引擎,这个精度是不可能绝对精准的
无所谓,但是一旦你的业务涉及金钱交易
那你往往不敢牺牲精度
因为一旦涉及金钱,错一点都要搞你半死
谁愿意让自己的钱少掉那么一点呢?
所以google卖个平板,并发才几十万还是几百万,就挂了
而且无法scale out,所以才被提起
而要scale out自然会有所牺牲
这个牺牲往往就是数据的精度
当你的业务不涉及钱的时候
比如搜索引擎,这个精度是不可能绝对精准的
无所谓,但是一旦你的业务涉及金钱交易
那你往往不敢牺牲精度
因为一旦涉及金钱,错一点都要搞你半死
谁愿意让自己的钱少掉那么一点呢?
所以google卖个平板,并发才几十万还是几百万,就挂了
d*r
8 楼
我倒是觉得lz很多理解得比较本质到点. Mongo 有时像传统 db,只是伪装,是无间道
而已.
我还是以前的观点,巨讨厌 SQL, RDBMS,从N年前本科学这玩意儿,就觉得用着憋屈,
就是一残疾.
一年一度的 12306 春晚帖又要开始了,哈哈
而已.
我还是以前的观点,巨讨厌 SQL, RDBMS,从N年前本科学这玩意儿,就觉得用着憋屈,
就是一残疾.
一年一度的 12306 春晚帖又要开始了,哈哈
z*e
10 楼
太多人思考问题时候脱离现实
一个最简单的思考
铁道部有没有现有的db?
当然有嘛
那怎么对付现有的db?
全部丢掉不用?
你是领导,你敢这么做?
你就忽悠吧
一个最简单的思考
铁道部有没有现有的db?
当然有嘛
那怎么对付现有的db?
全部丢掉不用?
你是领导,你敢这么做?
你就忽悠吧
z*e
14 楼
那这个文章大了
顺便,two phase commit是一种有缺陷的解决方案
并不能真正替代transaction
一般工作中还是尽量避免使用
因为网络本身并不稳定,第二次commit是有可能fail的
然后如何防止第二次commit挂掉,又有各种设计
这就是分布式算法一天到晚思考的问题
这些问题很棘手,所以一般工作中采用的方式是绕开
而不是迎头而上,否则你的麻烦可不小
常见的绕开就是分库,不要急着做成分布式
尤其是量比较小的时候,如果量大了的话,花点钱请点人
问问他们怎么做,如果你是接盘的,看看前人怎么做
前人做的work的话,就继续那么做
如果不work,那你接盘时候要小心点了,给自己留条退路未必是坏事
这个讨论短时间内不会有结果
【在 n******1 的大作中提到】
: 好吧,我们可以开始讨论一下什么是DB
顺便,two phase commit是一种有缺陷的解决方案
并不能真正替代transaction
一般工作中还是尽量避免使用
因为网络本身并不稳定,第二次commit是有可能fail的
然后如何防止第二次commit挂掉,又有各种设计
这就是分布式算法一天到晚思考的问题
这些问题很棘手,所以一般工作中采用的方式是绕开
而不是迎头而上,否则你的麻烦可不小
常见的绕开就是分库,不要急着做成分布式
尤其是量比较小的时候,如果量大了的话,花点钱请点人
问问他们怎么做,如果你是接盘的,看看前人怎么做
前人做的work的话,就继续那么做
如果不work,那你接盘时候要小心点了,给自己留条退路未必是坏事
这个讨论短时间内不会有结果
【在 n******1 的大作中提到】
: 好吧,我们可以开始讨论一下什么是DB
g*g
21 楼
我给的不是什么传统方案,上来就是 异步Cassandra收单,云端动态Scale. 后者12306
已经在做了,但是前者才是解决问题的关键。
至于后端,一天出几百万张票,我知道大机器Oracle都能做到1万以上,他们用内存数
据库也不过做到3万,不是本质的区别。
【在 n******1 的大作中提到】
: 我真没想到还在争12306这个话题,其中一个核心是关于transaction
: 由于自己的一些经验,我很容易理解好虫的方案,当然可能也是四平八稳,也没什么惊
: 喜。另外一些人的方案是跳出框架的约束,重新思考问题的本质,将商业逻辑抽象。我
: 没有能力判断两者的可行和好坏。
: 我自己也一直没法真正理解transaction这个问题,我尝试去读《Java Transaction
: Design Strategies》这本书,但是说实在,我看不懂这本书,虽然很多人说这本书已
: 经是最好,最容易理解。
: 似乎从一开始我们接受了关系型数据库天生的解决方案,生来就有外键,需要关联,需
: 要transaction,没有我们就不知道该怎么办。很多时候我们想优化,都说因为这个那
: 个约束,最后说是瓶颈,没法解决。我们经常被DBA这样忽悠。
已经在做了,但是前者才是解决问题的关键。
至于后端,一天出几百万张票,我知道大机器Oracle都能做到1万以上,他们用内存数
据库也不过做到3万,不是本质的区别。
【在 n******1 的大作中提到】
: 我真没想到还在争12306这个话题,其中一个核心是关于transaction
: 由于自己的一些经验,我很容易理解好虫的方案,当然可能也是四平八稳,也没什么惊
: 喜。另外一些人的方案是跳出框架的约束,重新思考问题的本质,将商业逻辑抽象。我
: 没有能力判断两者的可行和好坏。
: 我自己也一直没法真正理解transaction这个问题,我尝试去读《Java Transaction
: Design Strategies》这本书,但是说实在,我看不懂这本书,虽然很多人说这本书已
: 经是最好,最容易理解。
: 似乎从一开始我们接受了关系型数据库天生的解决方案,生来就有外键,需要关联,需
: 要transaction,没有我们就不知道该怎么办。很多时候我们想优化,都说因为这个那
: 个约束,最后说是瓶颈,没法解决。我们经常被DBA这样忽悠。
z*e
29 楼
legacy code
db本身就是一个非常大的legacy system
要改起来需要时间
现在绝大多数db操作都不是异步的
要改成异步的
目前做得比较靠谱的就是rxjava-jdbc
这个做出来之后,应该大多数db访问都会变成异步的
所以rxjava出来之后进一步打击了mongodb
本来mongodb被spark什么折磨得就很够呛了
twitter怎么做还是老话,twitter不涉及money
发错一个twit不会有太大问题,不值得参考
看看电商还比较靠谱点,至少应该看看twitter的财务组是怎么做的
【在 T*****9 的大作中提到】
: request都应该做成async的,但是在db应该满足transaction
: 同时可以看看类似于 Twitter的snow flake,出票的时候不同的机器可以负责一个自己
: 的range
db本身就是一个非常大的legacy system
要改起来需要时间
现在绝大多数db操作都不是异步的
要改成异步的
目前做得比较靠谱的就是rxjava-jdbc
这个做出来之后,应该大多数db访问都会变成异步的
所以rxjava出来之后进一步打击了mongodb
本来mongodb被spark什么折磨得就很够呛了
twitter怎么做还是老话,twitter不涉及money
发错一个twit不会有太大问题,不值得参考
看看电商还比较靠谱点,至少应该看看twitter的财务组是怎么做的
【在 T*****9 的大作中提到】
: request都应该做成async的,但是在db应该满足transaction
: 同时可以看看类似于 Twitter的snow flake,出票的时候不同的机器可以负责一个自己
: 的range
相关阅读
delete this problemmatlab question[求教大虾]关于C++编译期变量和运行期变量的区别,总是有疑惑问一个奇怪的tomcat+svg问题 (转载)关于malloc/free和循环Is it safe?这个同学很神如何 measure similarityhow to get runtime caller function?求一个evaluate chess board的简单算法how to check if a number is power of 2请问有没有interview 的题集想问一下。。。C++ Programming Zone zzchar *getbuff() 有什么equivalent的写法嘛?被reference搞晕了VC怎样改变一个Framewnd里的View?有人用intel library 吗?a simple question for C++ classinline functions in C++