【系统架构师】-案例篇(三)NoSQL与分布式对象调用

1、NoSQL

一个基于Web 2.0的大型社交网络系统。就该系统的数据架构而言,李工决定采用公司熟悉的数据架构,使用通用的商用关系型数据库,系统内部数据采用中央集中方式存储。该系统投入使用后,初期用户数量少,系统运行平稳。6个月后,用户数出现了爆炸式增长,系统暴露出诸多问题,集中表现在:

1.用户执行读写操作时,响应时间均变得很慢;

2.随着系统功能的扩充,原有数据格式发生变化,又出现新的数据格式,维护困难;

3.数据容量很快超过系统原有的设计上限,数据库扩容困难;

4.软件系统不断出现宕机,整个系统可用性较差。

经过多次会议讨论,公司的王工建议采用NoSQL数据库来替代关系数据库,以解决上述问题。但李工指出NoSQL数据库出现时间不长,在使用上可能存在风险。公司技术人员对NoSQL数据库产品进行了认真测试,最终决定采用NoSQL数据库来替代现有的数据库系统。

【问题1】

分别解释产生问题(1)~(4)的原因。

(1)用户响应时间慢。大型社交网络系统要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强可以,但是应付上万次SQL写数据请求,硬盘I/O就已经无法承受了。特别是涉及到多表连接操作,会导致响应变慢。

(2)数据格式变化。大型社交网络系统随着用户的使用,会不断地增加新的功能,导致原有数据格式发生变化,甚至出现新的数据格式。但关系数据库中采用元组方式组织数据,难以使用新型数据格式,难以维护。

(3)数据容量超过设计上限。对于大型社交网络系统,往往会在很短时间内产生海量数据。关系数据库多采用中央数据存储,使得数据容量受限于前期设计的上限,很难实现数据容量的横向扩展。

(4)系统可用性差:关系数据库采用中央数据存储,容易成为系统的性能瓶颈,单点故障很容易导致系统崩溃,负载过高往往导致系统出现宕机现象。

【问题2】

请针对问题(1)~(4),分别指出NoSQL数据库的哪些特点促使公司最终采用了NoSQL数据库。

针对问题(1),NoSQL数据库支持高并发数据访问,性能较高。

针对问题(2),NoSQL数据库的数据存储结构松散,能够灵活支持多种类型的数据格式。

针对问题(3),NoSQL数据库能够支持海量数据的存储,且易于横向扩展。

针对问题(4),NoSQL数据库基于分布式数据存储,不存在单点故障和性能瓶颈,系统可用性高。

【问题3】

请指出该系统采用NoSQL数据库时可能存在的问题。

(1)NoSQL数据库的现有产品不够成熟,大多数产品处于初创期。

(2)NoSQL数据库并未形成一定的标准,产品种类繁多,缺乏官方支持。

(3)NoSQL数据库不提供对SQL的支持,学习和应用迁移成本较高。

(4)NoSQL数据库支持的特性不够丰富,现有产品提供的功能比较有限。

NoSQL分类:

(1)键值(Key-Value)存储数据库。使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/Value模型对于IT系统来说的优势在于简单、易部署。

但是如果DBA只对部分值进行查询或更新的时候,Key/Value就显得效率低下了。

数据库产品包括: Redis,Memcache。

(2)列存储数据库。用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。数据库产品包括:Cassandra,HBase,Riak。

(3)文档型数据库。数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可以看作是键值数据库的升级版,允许中间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。数据库产品包括:CouchDB,MongoDb,SequoiaDB。

(4)图形(Graph)数据库。使用灵活的图形模型,并且能够扩展到多个服务器上。查询时利用图结构相关算法,比如最短路径寻址,N度关系查找等。数据库产品包括:Neo4J,InfoGrid,Infinite Graph。

Memcache与Redis区别

1)在数据类型方面:

Memcache支持简单Key/Value类型,而Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

     

2)在持久化方面:

Memcache不支持数据持久化,Redis支持支持数据持久化。

   

3)在分布式存储方面:

Memcache服务器需要通过hash一致化来支撑主从结构,而Redis支持多种方式,主从、sentinel、cluster等。

2、分布式对象调用

分布式基础设施为构建分布式系统所提供的基本支撑:

(1)构件管理支持:现有分布式基础设施一般通过构件容器为构件提供基本的运行环境;具体功能一般包括管理构件的实例及其生命周期、管理构件的元信息等。

(2)互操作支持:现有分布式基础设施均提供了高层通信协议以屏蔽节点的物理特性以及各节点在处理器、操作系统、程序设计语言等方面的异构性;基于互操作支持,开发人员在开发与调用分布式对象时,均不需自己编写处理底层通信的代码。

(3)公共服务支持:现有分布式基础设施通常将针对分布式软件的通用支持集成于一身,以公共服务的形式提供给应用程序;其提供的常见公共服务包括命名服务、事务服务、安全服务、持久性  服务等。 

  1. 客户端(client)以本地调用方式(即以接口的方式)调用服务;
  2. 客户端存根/桩(client stub)接收到调用后,负责将方法、参数等组装成能够进行网络传输的消息体(将消息体对象序列化为二进制 byte[]);
  3. 客户端通过sockets将消息发送到服务端;
  4. 服务端存根/框架( server stub)收到消息后进行解码(将消息对象反序列化);
  5. 服务端存根( server stub)根据解码结果调用本地的服务;
  6. 本地服务执行并将结果返回给服务端存根( server stub);
  7. 服务端存根( server stub)将返回结果打包成消息(将结果消息对象序列化);
  8. 服务端(server)通过sockets将消息发送到客户端;
  9. 客户端存根(client stub)接收到结果消息,并进行解码(将结果消息反序列化);
  10. 客户端(client)得到最终结果。

RPC的目标是要把2、3、4、7、8、9这些步骤都封装起来。

  • 27
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底层功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宣晨光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值