0%

为什么要划分

对于一个业务系统,以业务为核心,随着业务发展,在业务和工程侧必然导致以下2种情况的发生

img

最终导致一个问题:业务支持效率降低

解决的方法:

原则:组织/系统围绕业务的发展进行迭代升级

目标:既需要解决当下业务支持效率降低的问题,又能够很好的支撑业务长期稳定发展。

对于业务初期,通常会采用大的单体工程方式支持早期的快速发展,但是明显的业务膨胀带来代码量的急剧攀升,团队规模的扩大带来协作风险的增加,很难继续支持业务高速发展,故需要进行相应的领域拆分,以保持对业务的迭代的高效支撑,而 DDD 提供了一种从业务出发的建模方法,能很好满足我们的目标要求,故通过领域化,分而治之,进行我们的系统建设。

阅读全文 »

核心概念

战术设计(Tactic DDD): Entity, Value Object; Aggregate, Root Entity, Service, Domain Event; Factory, Repository
战略设计(Strategic DDD): Bounded Context, Context Map; Published Language, Shared Kernel, Open Host Service, Customer-Supplier, Conformist, Anti Corruption Layer (context relationship types)

Entity(实体)
  • 存在 2 点特征
    • 唯一标志:当一些对象不是由属性定义,而是由一个唯一标志定义的话,我们就可以认为它是一个实体。
    • 连续性:对象的连续性体现在对象是有生命周期的。
  • 由上2点可以看出,实体并非一定是映射到我们现实世界的某个具体事物
  • 生成实体唯一标识的 4 种方法
    • 用户提供一个或者多个初始唯一值作为输入时
    • 程序内部通过某种算法自动生成身份标识,例如UUID、雪花ID等
    • 程序依赖于持久化存储,比如数据库生成的自增主键
    • 通过其他的限界上下文决定出的唯一标识,作为程序的输入。
  • 实体不变性
    • 一个实体维护了一个或者多个不变条件
    • 不变条件主要是由聚合所关注
阅读全文 »

整体架构

image-20210228184558960

ha3本身是阿里系针对自己的场景自己研发的搜索引擎平台,也是基于自身的技术积累之上构建的,包括依赖的系统和代码库,都是自研自足的。经历了近10年的发展,也经受了核心场景双十一的考验,已经是一套非常完善成熟的系统,值得学习和研究。 图中为ha3的基本架构,比较简洁,主要分为数据源聚合(俗称 dump)、全量/增量/实时索引构建及在线服务等部分,其中数据源聚合在 tisplus 平台和 Blink 平台完成,核心有以下几个模块:

  • QRS
    • 输入的查询解析/校验,转发searcher
    • searcher 结果合并加工返回用户
  • Searcher
    • 文档召回服务,包含打分/排序/summary
  • Build Service
    • 全量/增量/实时索引构建,提供给在线服务使用
  • 其他
    • hippo: 调度系统,分配机器
    • suez/suze_ops,引擎管控/任务分发
    • deploy express,用于分发包,索引,配置等数据
    • swift,消息队列
    • cm2/vipserver,域名解析/服务发现
阅读全文 »

背景

Blink 其实是阿里内部基于 flink 改造的系统,学习 Blink 首先要学习 flink 相关的知识,先了解一下 flink 产生的背景和要解决的问题。

在大数据开始爆发的时代,mapreduce 作为初代的计算引擎,提供了分布式计算的核心思想,map&reduce的分阶段处理。但是 map reduce 本质上还是批处理计算框架,随着业务发展,流式数据计算处理的需求越来越旺盛,storm 等应运而生,但是作为第一代流式计算框架,存在一些设计上的缺陷,包括 exactly once等语义的支持。而且批处理和流处理作为处理同一个业务逻辑的两套系统,需要维护两套代码,并不是很友好。而这个时候 spark也发展起来了,集批处理,流处理,SQL 功能,图计算,机器学习于一身,并且支持 SparkR 和 PySpark 来做科学计算。而同时支持流处理和批处理的计算引擎,只有2个选择,除了spark 便是 flink。

阅读全文 »

背景

通过把nextjs的静态文件放到github pages上,省一波流量钱,但是发现资源文件总是会404,本来以为是github pages构建完成更新cdn需要缓存,但是过了很久都没有成功,以下是静态文件目录

1
2
3
4
5
-- _next
-- chunks
-- *.js
-- css
-- *.css

后来做了猜想是目录深度原因,但是测试下来还是没有用。 后面经过验证是 下划线开头的文件或者文件夹的原因, 折腾了好半天。 实际的原因只是因为 github pages使用jeklly引擎的默认规则。

解法

  • 避免使用下划线开头的文件(需要重新)
  • 通过在根目录创建.nojekyll 空文件, 关闭jeklly引擎
1
2
3
4
5
6
-- .nojekyll
-- _next
-- chunks
-- *.js
-- css
-- *.css

背景

最近学习了一下 nextjs,用这个写了个小网站 cushiwen.cn. 过程中发现 nextjs 天然支持 amp,虽然只有css-in-js的方式支持css, 但是还是很方便的,就尝试了一下。 发现过程中总是出现以下错误:

1
2
3
4
5
6
7
8
Error: Unable to fetch https://cdn.ampproject.org/v0/validator.js - connect ETIMEDOUT 172.217.27.129:443
at ClientRequest.<anonymous> (/Users/xxx/xtestw/xxx/fe-xxx/node_modules/next/dist/compiled/amphtml-validator/index.js:1:1159)
at ClientRequest.emit (node:events:329:20)
at TLSSocket.socketErrorListener (node:_http_client:478:9)
at TLSSocket.emit (node:events:329:20)
at emitErrorNT (node:internal/streams/destroy:188:8)
at emitErrorCloseNT (node:internal/streams/destroy:153:3)
at processTicksAndRejections (node:internal/process/task_queues:80:21)

这就很尴尬了, 我自己架了个ss的代理,但是node本身的请求没有走代理,需要解决这个问题。

大概有几种解法吧:

  • VPN的方式架梯子,成本有点高
  • Charles 全局代理捕获,自定义 response (未验证,理论可行)
  • node全局代理

本文讨论最后一种的解法

实现

查找了一些资料,通过global-agent来实现。其实现主要通过系统环境变量来实现的 主要步骤如下:

  1. 安装 global-agent

    1
    yarn add global-agent
  2. 添加引用

    在需要的页面里面添加引用,我是在 _app.tsx 文件添加的

阅读全文 »
×