设计数据密集型应用

本文探讨了设计可靠、可扩展和可维护的数据密集型应用的策略,重点关注Tweeter问题的Pull、Push和Push/Pull解决方案,响应时间优化,数据模型与查询语言如NoSQL、图模型和三元组,以及数据存储与检索技术,包括SSTable和哈希索引。此外,还讨论了数据编码与演化,如Json、Thrift、Protocol Buffers和Avro,强调了版本兼容性和数据演化的重要性。
摘要由CSDN通过智能技术生成

一. 可靠可扩展与可维护的应用系统

许多新型应用, CPU的处理能力往往不是第一限制因素, 关键在于数据量, 数据复杂度以及数据的快速多变
典型的应用架构

可靠性, 可扩展性, 可维护性

1. Tweeter问题

Pull
SELECT tweets.*, users.*
  FROM tweets
  JOIN users   ON tweets.sender_id = users.id
  JOIN follows ON follows.followee_id = users.id
  WHERE follows.follower_id = current_user
Push

Pull&Push

Push/Pull相结合

Pull & Push 大V用户特殊处理.
正常用户发Tweeter进行Push处理, 大V用户的Tweeter

2. Response Time

百分比表示RT
后续作者主要会讨论数据密集型应用的设计, 如何提升系统的可靠性, 可扩展性和可维护性

二. 数据模型与查询语言

语言的边界就是世界的边界
数据模型

2.1 数据查询语言(声明式/命令式)

// 命令式
function getSharks() {
   
    var sharks = [];
    for (var i = 0; i < animals.length; i++) {
   
        if (animals[i].family === "Sharks") {
   
            sharks.push(animals[i]);
        }
    }
    return sharks;
}

// Sql声明式
SELECT * FROM animals WHERE family ='Sharks';

// css声明式
li.selected > p {
   
	background-color: blue;
}

// js命令式
var liElements = document.getElementsByTagName("li");
for (var i = 0; i < liElements.length; i++) {
   
    if (liElements[i].className === "selected") {
   
        var children = liElements[i].childNodes;
        for (var j = 0; j < children.length; j++) {
   
            var child = children[j];
            if (child.nodeType === Node.ELEMENT_NODE && child.tagName === "P") {
   
                child.setAttribute("style", "background-color: blue");
            }
        }
    }
}


// postgresql
SELECT
	date_trunc('month'
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值