Skip to content

Latest commit

 

History

History
337 lines (245 loc) · 22.8 KB

README_CN.md

File metadata and controls

337 lines (245 loc) · 22.8 KB

YoMo Go codecovDiscord

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

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

For english, check: Github

🚀 3分钟教程

先决条件

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

1. 安装 CLI

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

Binary (推荐)

$ curl -fsSL "https://bina.egoist.sh/yomorun/cli?name=yomo" | sh

或者也通过以下方式安装 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: v1.0.0

2. 创建第一个yomo应用

$ yomo init yomo-app-demo

⌛  Initializing the Stream Function...
✅  Congratulations! You have initialized the stream function successfully.
ℹ️   You can enjoy the YoMo Stream Function 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"
	"encoding/json"
	"fmt"
	"time"

	"github.com/yomorun/yomo/rx"
)

// NoiseData represents the structure of data
type NoiseData struct {
	Noise float32 `json:"noise"` // Noise value
	Time  int64   `json:"time"`  // Timestamp (ms)
	From  string  `json:"from"`  // Source IP
}

var echo = func(_ context.Context, i interface{}) (interface{}, error) {
	value := i.(*NoiseData)
	value.Noise = value.Noise / 10
	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
}

// Handler will handle data in Rx way
func Handler(rxstream rx.Stream) rx.Stream {
	stream := rxstream.
		Unmarshal(json.Unmarshal, func() interface{} { return &NoiseData{} }).
		Debounce(50).
		Map(echo).
		StdOut()

	return stream
}

func DataTags() []byte {
	return []byte{0x33}
}

3. 调试和运行

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

ℹ️   YoMo Stream Function file: app.go
⌛  Create YoMo Stream Function instance...
⌛  YoMo Stream Function building...
✅  Success! YoMo Stream Function build.
ℹ️   YoMo Stream Function is running...
2021/11/16 10:02:43 [core:client]  has connected to yomo-app-demo (dev.yomo.run:9140)
[localhost] 1637028164050 > value: 6.575044 ⚡️=9ms
[StdOut]:  6.5750437
[localhost] 1637028164151 > value: 10.076103 ⚡️=5ms
[StdOut]:  10.076103
[localhost] 1637028164251 > value: 15.560066 ⚡️=8ms
[StdOut]:  15.560066
[localhost] 1637028164352 > value: 15.330824 ⚡️=2ms
[StdOut]:  15.330824
[localhost] 1637028164453 > value: 10.859857 ⚡️=7ms
[StdOut]:  10.859857

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

Sources

Stream Functions

Output Connectors

🗺 YoMo系统架构

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

yomo-flow-arch

📚 Documentation

YoMo ❤️ Vercel, Our documentation website is https://docs.yomo.run/.

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进展