Skip to content

Latest commit

 

History

History
344 lines (254 loc) · 22.7 KB

README_CN.md

File metadata and controls

344 lines (254 loc) · 22.7 KB

YoMo Go

YoMo 是为边缘计算打造的低时延流式 Serverless 开发框架,基于 QUIC Transport 协议通讯,以 Functional Reactive Programming 为编程范式,简化构建可靠、安全的低时延计算应用的复杂度,挖掘5G潜力,释放实时计算价值。

官网:https://yomo.run (感谢 Vercel 支持)

For english, check: Github

🚀 3分钟教程

先决条件

确保已安装 Go 编译运行环境,参考 安装 Go

1. 安装 CLI

可以通过以下的命令全局安装最新发布的 YoMo CLI:

go install github.com/yomorun/cli/yomo@latest

或者也可以将 CLI 安装在不同的目录:

env GOBIN=/bin go install github.com/yomorun/cli/yomo@latest

验证 CLI 是否成功安装

$ yomo -V

YoMo CLI version: v0.0.6

2. 创建第一个yomo应用

$ yomo init yomo-app-demo

⌛  Initializing the Serverless app...
✅  Congratulations! You have initialized the serverless function successfully.
ℹ️   You can enjoy the YoMo Serverless via the command: 
ℹ️   	DEV: 	yomo dev -n Noise yomo-app-demo/app.go
ℹ️   	PROD: 	First run source application, eg: go run example/source/main.go
		Second: yomo run -n yomo-app-demo yomo-app-demo/app.go

$ cd yomo-app-demo

YoMo CLI 会自动创建带有以下内容的 app.go 文件:

package main

import (
	"context"
	"fmt"
	"time"

	y3 "github.com/yomorun/y3-codec-golang"
	"github.com/yomorun/yomo/pkg/rx"
)

// NoiseDataKey 用于通知YoMo只订阅Y3序列化后Tag为0x10的value
const NoiseDataKey = 0x10

// NoiseData 描述了Y3序列化后的Tag为0x10的Value所对应的反序列化数据结构
type NoiseData struct {
	Noise float32 `y3:"0x11"`
	Time  int64   `y3:"0x12"`
	From  string  `y3:"0x13"`
}

var printer = func(_ context.Context, i interface{}) (interface{}, error) {
	value := i.(NoiseData)
	rightNow := time.Now().UnixNano() / int64(time.Millisecond)
	fmt.Println(fmt.Sprintf("[%s] %d > value: %f ⚡️=%dms", value.From, value.Time, value.Noise, rightNow-value.Time))
	return value.Noise, nil
}

var callback = func(v []byte) (interface{}, error) {
	var mold NoiseData
	err := y3.ToObject(v, &mold)
	if err != nil {
		return nil, err
	}
	mold.Noise = mold.Noise / 10
	return mold, nil
}

// Handler will handle data in Rx way
func Handler(rxstream rx.RxStream) rx.RxStream {
	stream := rxstream.
		Subscribe(NoiseDataKey).
		OnObserve(callback).
		Debounce(50).
		Map(printer).
		StdOut().
		Encode(0x11)

	return stream
}

3. 调试和运行

  1. 为了方便调试,我们创建了一个云端的数据模拟器,它可以产生源源不断的数据,我们只需要运行yomo dev就可以看到:
$ yomo dev

ℹ️   YoMo serverless function file: app.go
⌛  Create YoMo serverless instance...
⌛  YoMo serverless function building...
✅  Success! YoMo serverless function build.
ℹ️   YoMo serverless function is running...
ℹ️   Run: /Users/xiaojianhong/Downloads/yomo-app-demo/sl.yomo
2021/06/07 12:00:06 Connecting to zipper dev.yomo.run:9000 ...
2021/06/07 12:00:07 ✅ Connected to zipper dev.yomo.run:9000
[10.10.79.50] 1623038407236 > value: 1.919251 ⚡️=-25ms
[StdOut]:  1.9192511
[10.10.79.50] 1623038407336 > value: 11.370256 ⚡️=-25ms
[StdOut]:  11.370256
[10.10.79.50] 1623038407436 > value: 8.672209 ⚡️=-25ms
[StdOut]:  8.672209
[10.10.79.50] 1623038407536 > value: 4.826996 ⚡️=-25ms
[StdOut]:  4.826996
[10.10.79.50] 1623038407636 > value: 16.201773 ⚡️=-25ms
[StdOut]:  16.201773
[10.10.79.50] 1623038407737 > value: 13.875483 ⚡️=-26ms
[StdOut]:  13.875483

🌶 与更多的优秀开源项目天然集成

Sources

Flows

Sinks

🗺 YoMo系统架构

Edge-Native: YoMo 追求随地部署、随时迁移、随时扩容

yomo-flow-arch

📚 Documentation

YoMo ❤️ Vercel, Our documentation website is

Vercel Logo

🎯 越来越多的数据产生在数据中心之外,YoMo 关注在离数据更近的位置,提供便利的计算框架

  • 对时延敏感的场景
  • 蜂窝网络下的会出现性能抖动,存在丢包、延时,比如LTE、5G
  • 源源不断的高频数据涌向业务处理
  • 对于复杂系统,希望使用 Streaming-Serverless 架构简化

🌟 YoMo 优势:

  • 全程基于 QUIC 协议传输数据,使用UDP协议替代TCP协议后,大幅提升了传输的稳定性和高通率
  • 自研的yomo-codec优化了数据解码性能
  • 全程基于 Rx 实现 Stream Computing 模型,并简化面向流式编程的复杂度
  • 通讯协议级别的“本质安全”

🦸 成为 YoMo 贡献者

首先感谢您的 contributions,是您这样的人让 YoMo 能变得越来越好!参与 YoMo 项目有很多种方式:

🤹🏻‍♀️ 反馈和建议

任何时候,建议和意见都可以写在 Discussion,每一条反馈都一定会被社区感谢!

开源协议

Apache License 2.0

QUIC学习资料

Awesome QUIC Logo

QUIC 的全称是 Quick UDP Internet Connections protocol, 由 Google 设计提出,目前由 IETF 工作组推动进展。其设计的目标是替代 TCP 成为 HTTP/3 的数据传输层协议。熹乐科技在物联网(IoT)和边缘计算(Edge Computing)场景也一直在打造底层基于 QUIC 通讯协议的边缘计算微服务框架 YoMo,长时间关注 QUIC 协议的发展,遂整理该文集并配以适当的中文翻译,方便更多关注 QUIC 协议的人学习。

QUIC Weekly - 每周一草

在线社区:🍖discord/quic
维护者:🦖YoMo

QUIC Weekly - 20210106期

QUIC Weekly - 20201209期

  • Wireshark v3.4.1 发布,增加了很多与 QUIC 相关的更新
  • 📢 draft-ietf-quic-manageability 讨论了 QUIC 传输协议的可管理性,重点讨论影响 QUIC 流量的网络操作的注意事项,比如,要实现 QUIC 的负载均衡,建议参考该文
  • 📢 Applicability of the QUIC Transport Protocol 讨论了QUIC传输协议的适用性,重点讨论了影响通过QUIC开发和部署应用协议的注意事项,比如,实现0-RTT的过程中要注意的安全问题
  • w3c WebTransport 在WebIDL中定义了一组ECMAScript API,允许在浏览器和服务器之间发送和接收数据,在底层实现可插拔协议,在上面实现通用API。本规范使用可插拔的协议,QUIC-TRANSPORT 就是这样一个协议,向服务器发送数据和从服务器接收数据。它可以像WebSockets一样使用,但支持多流、单向流、无序传输、可靠以及不可靠传输。
  • 📽 Google 的 David Schinaz 的视频 QUIC 101
  • Netty 发布了支持 QUIC 的 0.0.1.Final 该 Codec 实现了 IETF QUIC draft-32 版本,基于 qiuche 项目构建
  • Cloudflare 的博客 为 QUIC 加速 UDP 包传输
  • PDF: 软件模拟器 QUIC 协议的性能分析
  • 📢 draft-schinazi-masque-h3-datagram-01 QUIC DATAGRAM 扩展为在 QUIC 上运行的应用协议提供了一种发送不可靠数据的机制,同时利用了QUIC的安全和拥塞控制特性。本文档定义了当在 QUIC 上运行的应用协议是 HTTP/3 时,如何通过在 frame payload 的开头添加一个标识符来使用 QUIC DATAGRAM frame。这允许HTTP消息使用不可靠的DATAGRAM帧来传递相关信息,确保这些帧与HTTP消息正确关联。

QUIC Weekly - 20201202期

QUIC Weekly - 20201125期

QUIC Weekly - 20201118期

QUIC Weekly - 20201111期

QUIC Weekly - 20201104期

QUIC Weekly - 20201028期

  • 📢 DNS-over-QUIC
    • 对科学那啥可是个好东西,太敏感,咱也不敢多说...
  • Paper 基于QUIC的MQTT协议的实现和分析
    • 在端到端的通讯中,确保可靠和安全通信的基础是Transport和Security协议。对于IoT应用,这些协议必须是轻量级的,毕竟IoT设备通常都是硬件能力受限。不幸的是,目前广为流行的TCP/TLS和UDP/DTLS这两种方式,在建连、时延、连接迁移等方面有很多的不足。这篇论文研究了这些缺陷的根源,展示了如何借助QUIC协议优化IoT场景从而达到更高的网络性能,以IoT领域使用范围较广的MQTT协议为例,团队实现了主要的API和功能,并比较了使用QUIC和TCP构建的MQTT协议在有线网络、无线网络和长距离实验场景(long-distance testbeds)中的差异。
    • 测试的结果标明,基于QUIC协议实现的MQTT协议降低建连开销达56%
    • 在半连接场景下,对CPU和内存的消耗分别降低了83%和50%
    • 因为避免了队头阻塞(HOL Blocking)的问题,数据分发时延降低了55%
    • 数据传输速率的抖动也因为QUIC的连接迁移特性得到明显的改善。
  • Article HTTP/3: 你需要知道的下一代互联内网协议
  • Article QUIC和物联网IoT
    • IoT设备是应用QUIC协议的一个好场景,因为这些设备通常工作在无线(蜂窝)网络下(Cellular network),且需要快速建连、0-RTT和重传。但是,这些设备CPU能力普遍较弱。QUIC的作者其实多次提到QUIC对IoT应用场景有很大的提升,可惜的是,至今还没有一套为这个场景设计的协议栈(其实有啊:基于QUIC协议的Edge Computing框架: 🦖YoMo
  • Article 未来的Internet: HTTP/3 — No More TCP, let’s QUIC fix it(谐音梗我翻不出来了...)

QUIC Weekly - 20201021期

QUIC Weekly - 20201014期

  • Adoption Chrome 正在部署 HTTP/3 和 IETF QUIC
    • 当前最新的 Google QUIC 版本(Q050)与 IETF QUIC 有很多相似之处。但是到目前为止,大多数 Chrome 用户在未启用某些命令行选项的情况下没有与 IETF QUIC 服务器通信。
    • Google 搜索延迟减少了2%以上。 YouTube 的重新缓冲时间减少了9%以上,而台式机的客户端吞吐量增加了3%以上,移动设备的客户端吞吐量增加了7%以上。我们很高兴地宣布,Chrome 即将推出对 IETF QUIC(特别是草稿版本 H3-29)的支持。
    • 目前,有25%的 Chrome 稳定用户正在使用 H3-29。我们计划在接下来的几周内增加该数字,并继续监控性能数据。
    • Chrome 将积极支持 IETF QUIC H3-29 和 Google QUIC Q050,让支持 Q050 的服务器有时间更新到 IETF QUIC。
  • Adoption Cloudflare 向用户发送电子邮件,通知从本月开始 H3 将自动启用
  • CDN 最近被误解了。跨站点的浏览器缓存并不是那么重要,重要的是在存在点(POP)进行缓存。这种 POP 与你的终端用户的距离如此之近,可带来性能提升,因为TCP的传输距离很差。QUIC 可以通过改用 UDP 来解决此问题。 HackerNews
  • TechTalk Lucas Pardue:QUIC 和 HTTP/3:开放标准和开放源代码 (2020年10月27日。)
  • OpenSource quiche 已支持 QUIC 和 HTTP/3 不可靠的数据报。在保证数据的传输不是最重要的情况下,它可以降低延迟。
  • 在 Haskell 中开发 QUIC 丢失检测和拥塞控制

IETF进展