豪翔天下

Change My World by Program

0%

最近公司有一个安全方面的业务,需要实时监控所有访客的情况。之前是定时去查询Elasticsearch的接口进行统计分析,但是这个时间间隔不好把握,并且Elasticsearch并不适合特别实时的查询操作。实时的分布式流计算引擎首推Spark,它与Hadoop等相比的优势在这里讲得比较清楚了。

  • **RDD(Resilient Distributed Dataset弹性分布式数据集)**:这是spark的主要数据概念。有多种来源,容错机制,并且能缓存、并行计算。RDD在整个计算流程中会经过不同方式的变换,这种变换关系就是一个有向无环图。
  • 需要注意的是,所有的方法在定义执行之前都是异步的,所以不能简单地在下面的方法外部添加try...catch...进行异常捕获,最好是在传入的函数里面进行异常的捕获(如果是lambda,请确认lambda不会报错,否则如果lambda报错整个程序都会报错并终止允许)
  • Spark应用程序可以使用大多数主流语言编写,这里使用的是python,只pip install pyspark即可
  • Stage(调度阶段): 每个Job会根据RDD大小切分城多个Stage,每个Stage包含一个TaskSet
  • TaskSet(任务集): 一组关联的Task集合,不过是没有依赖的
  • Task(任务): RDD中的一个分区对应一个Task。
  • Narrow Dependency(窄依赖): 比较简单的一对一依赖和多对一依赖(如union)
  • Shuffle Dependency(宽依赖): 父RDD的分区被多个子RDD分区所使用,这时父RDD的数据会被再次分割发送给子RDD
  • Spark 内存分配: 分为这三块:
    • execution: 执行内存,基本的算子都是在这里面执行的,这块内存满了就写入磁盘。
    • storage: 用于存储broadcast, cache, persist
    • other: 程序预留给自己的内存,这个可以不用考虑
  • Duration
    • batchDuration: 批次时间
    • windowDuration: 窗口时间,要统计多长时间内的数据,必须是batchDuration的整数倍
    • slideDuration: 滑动时间,窗口多长时间滑动一次,必须是batchDuration的整数倍,一般是跟batchDuration时间相同
阅读全文 »

N+1问题

考虑这样一个常见应用场景,前端页面上需要展示一个文章列表,其中包括了文章的标题,并且会同时显示每篇文章的作者名。那么我们可能会按下面几种方案来设计我们的API。

方案一: 对于Restful,设计下面两个接口,客户端总共需要请求1+N次接口,查询数据库1+N次。

1
2
/articles	# 文章列表接口
/articles/{article_id}/author # 获取文章作者信息接口
阅读全文 »

本讲将会介绍GraphQL的基础语法,毕竟业务永远都离不开增删改查。

除“读“操作可以直接与数据库model相映射以外,跟”写“有关的操作的后端定义依然是需要自己去实现业务相关的映射逻辑的。当然,无论读写都是需要定义相应的Model的,可以在Web上面查看已经定义的Mutation:

阅读全文 »

前面几讲讲了理论层面,大家应该对GraphQL不再陌生了。这里简单讲述一下本教程demo的搭建方式。

代码目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
.
├── Dockerfile
├── LICENSE
├── Pipfile
├── Pipfile.lock
├── README.md
├── database.sql # 初始数据库
├── db.py
├── managers # 封装数据库操作
│   ├── __init__.py
│   ├── article.py
│   ├── author.py
│   ├── comment.py
│   ├── ordinary_writer.py
│   └── professional_writer.py
├── models # 数据库映射对象
│   ├── __init__.py
│   ├── article.py
│   ├── author.py
│   ├── comment.py
│   ├── ordinary_writer.py
│   └── professional_writer.py
├── mutations # 操作变更定义
│   ├── __init__.py
│   ├── article.py
│   ├── author.py
│   └── comment.py
├── run.py # 主程序
├── schemas # 模型数据结构定义
│   ├── __init__.py
│   ├── article.py
│   ├── author.py
│   ├── comment.py
│   ├── interfaces.py # 接口schema
│   ├── ordinary_writer.py
│   └── professional_writer.py
├── settings.py # 数据库连接配置
└── web_template.py #
阅读全文 »

对于简单的GraphQL查询,其实很简单,任何一个会CRUD的开发者都知道,使用简单的if … else … 就能实现逐字段的遍历查询。这也就是GraphQL的核心算法,只是针对每个字段,GraphQL会提供一个resolver去实现特殊的字段获取方式,详情可以看demo代码,例如: https://github.com/haoflynet/graphql-tutorial/blob/master/schemas/article.py。

假设有这样一个查询:

1
2
3
4
5
6
7
8
{
articles {
title // SEELCT `title` FROM `articles`;
comments {
content // for id in article_ids: SELECT `content` FROM `comments` WHERE `article_id`=id;
}
}
}
阅读全文 »

GraphQL发展至今,已有Github、Facebook、Airbnb等大厂在大量地使用,大厂在使用的过程中,不断地进行技术沉淀,也诞生了许多实用的开源工具。这里重点介绍Github的Awesome系列awesome-graphql,它列举了Github上面开源的并且十分有用的graphql相关的服务端、客户端以及生态链相关的其他工具。graphql发展至今,已有非常完整的开发语言支持,主流的语言Javascript、Python、Java、PHP、Ruby等都有各自的服务端与客户端实现,在awesome-graphql上还有部分语言的实现参考示例代码。这里简要介绍几个常见的库:

Apollo-Client: 算是最知名的GraphQL客户端了,因为它是Javascript的客户端。功能丰富,可用于不同的服务端及前端。

GraphiQL: 一款运行于浏览器的GraphQL IDE,几乎所有的服务端库都会提供这么一个经典的web页面。该页面是一个单页面应用,可以直接在其上运行查询语句,自带代码补全和校错功能,直接查看GraphQL所有的文档(定义好的Schema),比如Github API的在线文档,登录后就能在线发送真实的请求获取到我们想要的数据。由于我们之后要进行实践教程,所以这里有今后用于实践的真实的Web端,访问地址

阅读全文 »

多年前,我喜欢用sublime,那时候我主要开发的是Python这种很简单的脚本语言,后来接触了IDE才发现,对开发者来说,编辑器真的只是暂时的工具,真正能提高大幅度提高开发效率的绝对是功能完整、适配性强的IDE呀😂。

阅读全文 »

看了文约小强的简介,又看了电影版《流浪地球》的预告,我抓紧时间将原著看完了,只花了大概一两个小时吧,表示从来没看过这么短的短篇小说。不过作者正是《三体》的作者刘慈欣,作者具体是个什么样的人我不了解,但是提起中国科幻,肯定是不能不提到他的。

阅读全文 »

公司封网,这两天除了大致规划明年工作计划以外,也顺手整理了今年的一些笔记,记录下这些Tips,不过有很多都不知道出处了。

阅读全文 »

盼望着盼望着,米家的智能家居终于能用苹果的Siri直接控制了,终于不用自己去搭homebridge了。我至今没有买小米家的智能音箱,是因为我相信有一天绝对能用Siri直接控制的,这一天居然真的来了。小米音箱和siri虽然都是通过语音控制,但却是两种不同的媒介,一种必须拿起手机先喊siri,一种必须依赖音箱。我更喜欢前者,因为我能做到哪儿都拿着手机,但不能做到每个房间一个音箱。这个音箱拿来录录抖音倒还可以。

夏洛克智能贴锁M1

299的价格实现每天不带钥匙出门,比动不动就上千的指纹锁性价比高多了。其原理就是将钥匙插入锁孔,然后由手机连接蓝牙,蓝牙控制贴锁,贴锁转动钥匙实现开门。因为必须用蓝牙,所以不必担心远程误开。但是有些人质疑其实用性,这样出门虽然不带钥匙了,但是必须带手机呀。我想说的是,很多人买指纹锁、智能锁的主要目的不就是不带钥匙吗,又不是不带手机,谁出门不带手机的,并且即使哪天手机没电或者手机真没带,也能通过别人的手机登录自己的帐号,或者让已经被分配钥匙的人来开门就好了。这是除路由器以外我现在实用最高频率的米家产品了。

小米万能遥控器

我通过它实现了控制家中的乐视电视、松下吸顶灯和艾美特风扇。其中电视和灯在遥控器里面都有现成的红外线模板,风扇没有,但是提供了学习功能。遥控器放在客厅,主要控制客厅的红外家电,非常实用。

小米路由器

路由器普遍内存和硬盘比较小,能少折腾就少折腾。

阅读全文 »