某种程度上,一个计算机软件的运行本质上是数据流动的过程,即Dataflow,不过一般用workflow这个词,给我感觉它们是类似的,不过软件系统里也有不流动的数据,比如你代码里定义的临时变量什么的。
数据库的查询过程是告诉DBMS要什么结果而不是告诉DBMS怎么做,然后由DBMS生成查询方案,即Dataflow。历史的查询算法积累分析告诉我们,DBMS自动生成的查询计划比人写的代码一般靠谱(前提是你查询语句写对了)。所以从这个角度上,如果在软件开发中如果能借鉴数据库中的Dataflow的一些算法,指不定对于整个系统的设计优化是有帮助的。事实上大型企业软件workflow优化也是数据库研究社区里面的一个研究热点。过两天我去听个这方面的报告,回来想起来也许会补充补充。
不过,实际上,对于软件开发,还是有什么工具就用什么工具。在把一个软件从无到有做出来的第一步,什么都重要,别想太多,这个时候数据库就是个存储平台。在第二歩的优化过程中,做出来再想优化,指不定这套东西有点用,前提是你能驾驭这些算法,并且有足够的空间让你去施展这套东西
首先明确说明Kafka不是数据库,它没有schema,也没有表,更没有索引。
1它仅仅是生产消息流、消费消息流而已。从这个角度来说Kafka的确不像数据库,至少不像我们熟知的关系型数据库。
那么到底什么是数据库呢?或者说什么特性使得一个系统可以被称为数据库?经典的教科书是这么说的:数据库是提供 ACID 特性的,我们依次讨论下ACID。
1、持久性(durability)
我们先从最容易的持久性开始说起,因为持久性最容易理解。在80年代持久性指的是把数据写入到磁带中,这是一种很古老的存储设备,现在应该已经绝迹了。目前实现持久性更常见的做法是将数据写入到物理磁盘上,而这也只能实现单机的持久性。当演进到分布式系统时代后,持久性指的是将数据通过备份机制拷贝到多台机器的磁盘上。很多数据库厂商都有自己的分布式系统解决方案,如GreenPlum和Oracle RAC。它们都提供了这种多机备份的持久性。和它们类似,Apache Kafka天然也是支持这种持久性的,它提供的副本机制在实现原理上几乎和数据库厂商的方案是一样的。
2、原子性(atomicity)
数据库中的原子性和多线程领域内的原子性不是一回事。我们知道在Java中有AtomicInteger这样的类能够提供线程安全的整数 *** 作服务,这里的atomicity关心的是在多个线程并发的情况下如何保证正确性的问题。而在数据库领域,原子性关心的是如何应对错误或异常情况,特别是对于事务的处理。如果服务发生故障,之前提交的事务要保证已经持久化,而当前运行的事务要终止(abort),它执行的所有 *** 作都要回滚,最终的状态就好像该事务从未运行过那样。举个实际的例子,
第三个方法是采用基于日志结构的消息队列来实现,比如使用Kafka来做,如下图所示:
在这个架构中app仅仅是向Kafka写入消息,而下面的数据库、cache和index作为独立的consumer消费这个日志——Kafka分区的顺序性保证了app端更新 *** 作的顺序性。如果某个consumer消费速度慢于其他consumer也没关系,毕竟消息依然在Kafka中保存着。总而言之,有了Kafka所有的异质系统都能以相同的顺序应用app端的更新 *** 作,
3、隔离性(isolation)
在传统的关系型数据库中最强的隔离级别通常是指serializability,国内一般翻译成可串行化或串行化。表达的思想就是连接数据库的每个客户端在执行各自的事务时数据库会给它们一个假象:仿佛每个客户端的事务都顺序执行的,即执行完一个事务之后再开始执行下一个事务。其实数据库端同时会处理多个事务,但serializability保证了它们就像单独执行一样。举个例子,在一个论坛系统中,每个新用户都需要注册一个唯一的用户名。一个简单的app实现逻辑大概是这样的:
4、一致性(consistency)
最后说说一致性。按照Kelppmann大神的原话,这是一个很奇怪的属性:在所有ACID特性中,其他三项特性的确属于数据库层面需要实现或保证的,但只有一致性是由用户来保证的。严格来说,它不属于数据库的特性,而应该属于使用数据库的一种方式。坦率说第一次听到这句话时我本人还是有点震惊的,因为从没有往这个方面考虑过,但仔细想想还真是这么回事。比如刚才的注册用户名的例子中我们要求每个用户名是唯一的。这种一致性约束是由我们用户做出的,而不是数据库本身。数据库本身并不关心或并不知道用户名是否应该是唯一的。针对Kafka而言,这种一致性又意味着什么呢?Kelppmann没有具体展开,
希望能帮到你,谢谢!
和软件开发类似,两者都要互相用到,彼此交叉。比如银行的自动取款机系统,就是数据库开发的典型例子。你会觉得这个应该是软件开发的写代码啊,但是事实上写代码只是取款机系统实现的一步而已。数据库开发分六步:需求分析、概念结构设计、逻辑结构设计、数据库的物理设计、数据库的实施、数据库的运行和维护。写代码只是数据库实施中的一部分,这样讲应该能明白吧。还有像超市的收银系统,学校的教务系统都是数据库的例子,光会写代码是编不出来的。我目前已经考了数据库系统工程师,这学期准备考个软件设计师。两者的区别是数据库的语言主要是SQL,软件设计师则是写代码,C、C++ 、Java等
以上就是关于数据库在软件开发中的地位是怎样的全部的内容,包括:数据库在软件开发中的地位是怎样的、软件开发中的Kafka和数据库的关系是什么呢、数据开发是做什么东西的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)