我们正在建立一个大型的电子商务网站,以服务超过100,000个用户,但是我们希望用户数量在第一年将迅速增长.通常,该网站的功能与ebay非常相似,用户可以在其中创建,更新和删除列表.用户还可以搜索列表并购买感兴趣的项目.基本上,系统具有交易和非交易需求:
**Transactional**
Create a listing (multi-record update)
Remove a listing
Update a listing
Purchase a listing (multi-record update)
**Non-Transactional**
Search listings
View a listing
我们想利用可扩展的,基于文档的NoSQL数据存储(例如Couch或MongoDB)的功能,但同时我们需要一个关系存储来支持ACID事务需求.因此,我们提出了使用这两种技术的混合解决方案.
由于该站点是“主要阅读站点”,并且为了满足可扩展性需求,我们建立了MongoDB数据存储.为了满足交易需求,我们设置了一个MySQL集群.作为中间件组件,我们使用JBoss App服务器集群.
当出现“搜索”请求时,JBoss将请求定向到Mongo处理搜索,该搜索应会产生非常快速的结果,而不会给MySQL造成负担.创建,更新,删除或购买列表后,JBoss将针对MySQL进行事务处理.为了使MongoDB和MySQL保持同步,由JBoss针对MySQL处理的所有事务请求都将在业务逻辑中包括最后一步,即通过清单ID更新MongoDB中的相应文档.我们计划使用MongoDB Java API来促进更新文档的集成.
因此,从本质上讲,由于该站点被广泛阅读,因此该体系结构允许我们水平扩展MongoDB以容纳更多用户.使用MySQL使我们能够利用关系数据库的ACID属性,同时通过JBoss中间件保持我们的MongoDB存储更新.
这种架构有什么问题吗?没有一个平台可以同时提供一致性,可用性和分区容忍性-NoSQL系统通常会放弃一致性-但是至少使用这种混合方法,我们可以以增加系统复杂性为代价来实现这三个方面,并且可以,因为我们的所有要求都得到满足.
解决方法:
这种方法没有错.
Infact目前也正在开发同时利用SQL和Java的应用程序(电子商务). NonSQL.我们的是Rails应用程序,其中90%的数据存储在mongo中,并且只有交易性&库存物品存放在mysql中.所有事务都在Mysql中处理,其他所有事务都转到mongo中.