Protocol Buffers

10大高性能开发宝石,我要消灭一半程序员!

為{幸葍}努か 提交于 2020-12-11 12:53:46
这篇文章,我们循序渐进,从内存、磁盘I/O、网络I/O、CPU、缓存、架构、算法等多层次递进,串联起高性能开发十大必须掌握的核心技术。 - I/O优化:零拷贝技术 - I/O优化:多路复用技术 - 线程池技术 - 无锁编程技术 - 进程间通信技术 - RPC && 序列化技术 - 数据库索引技术 - 缓存技术 && 布隆过滤器 - 全文搜索技术 - 负载均衡技术 准备好了吗,坐稳了,发车! 首先,我们从最简单的模型开始。 老板告诉你,开发一个静态web服务器,把磁盘文件(网页、图片)通过网络发出去,怎么做? 你花了两天时间,撸了一个1.0版本: 主线程进入一个循环,等待连接 来一个连接就启动一个工作线程来处理 工作线程中,等待对方请求,然后从磁盘读文件、往套接口发送数据,完事儿 上线一天,老板发现太慢了,大一点的图片加载都有卡顿感。让你优化,这个时候,你需要: I/O优化:零拷贝技术 上面的工作线程,从磁盘读文件、再通过网络发送数据,数据从磁盘到网络,兜兜转转需要拷贝四次,其中CPU亲自搬运都需要两次。 零拷贝技术 ,解放CPU,文件数据直接从内核发送出去,无需再拷贝到应用程序缓冲区,白白浪费资源。 Linux API: ssize_t sendfile( int out_fd, int in_fd, off_t *offset, size_t count );

详解PROTOCOL BUFFERS

十年热恋 提交于 2020-12-08 10:27:57
1. 前言 Protocal Buffers 是google推出的一种序列化协议。由于它的编码和解码的速度,已经编码后的大小控制的较好,因此它常常被用在RPC调用中,传递参数和结果。比如 gRPC 。 Protocal Buffers 的实现非常简单,本文将对比JSON协议,来聊聊Protocol Buffers的实现以及它高性能的秘密 2. 正篇 2.1 减少传输量(字段名和定界符) 汽车类在Golang中的定义 type Car struct { Age int32 `json:"age"` Color string `json:"color"` Price float32 `json:"price"` } JSON字符串表示 { "age": 10, "color": "red", "price": 15.2568983 } 1)”{” 、”}”、”[“, “]”、 双引号、”,” 、”:” 是为了把字段与字段之间,以及字段的名称和值分隔开。它们不是必须的。 2)字段的名称”age”、”color”、”price”也不是必须的。 如果发送方和接收方都对对象的定义是明晰的,那么字段的名称也不要传递 Protocol Buffers 对象定义 message Car { int32 age = 1; string color = 2; double price = 3; }

AVOD:Aggregate View Object Detection跑通(官方README小补充)

烂漫一生 提交于 2020-12-04 09:56:33
本地环境 Ubuntu20.04 + anaconda + tensorflow-gpu1.3.0 + cudatookit8.0 + cudnn6.0 + protobuf3.14.0(protobuf用3.2.0会报错) 1 . protobuf文件解释 protobuf是google的一个开源的用来做数据通信的库,在avod/protos文件中有很多.proto文件,这些文件定义了通信用的数据内容和格式,但是想在程序中使用他们,得使用protobuf对他们进行编译,给每个.proto文件生成一个python文件。执行中之后会提示有语法错误,只需看avod/protos文件中是否生成了python文件,生成即可。 2 . 配置环境变量 工程是基于python编写的,定义了很多模块,这些模块之间需要互相调用,但各个模块又是相对独立的,所以需要把各个模块的路径添加到python的环境变量中,以方便他们之间互相调用。不配置环境变量导致调用包的时候报错 在终端输入以下指令打开设置环境变量的文件,添加绝对路径(没有gedit用vim) gedit ~ / . bashrc export PYTHONPATH= / path / to / your / avod: / path / to / your / avod / wavedata: $PYTHONPATH source ~ / .

基于grpc协议的微服务架构grpc-nebula

陌路散爱 提交于 2020-12-04 00:26:49
前言 最近开发了一个基于grpc协议的微服务框架grpc-nebula的一个项目,此微服务框架已经开源但是比较小众,今天就简单分享下这个微服务架构。grpc-nebula分为java版本和c++版本,本次就只分享java版本的。虽然大家在工作中用不到这个框架,但是多了解些并且和自己所用框架进行对比,能够加深自己对微服务框架的理解程度以及拓宽知识的宽度。 微服务框架介绍 grpc简介 grpc是一个多语言、高性能、开源的通用远程过程调用(RPC)框架。 来自于Google的开源项目,2016年8月19日发布了成熟的1.0.0版本 基于HTTP/2等技术 grpc支持Java, C,C++, Python等多种常用的编程语言,并且客户端和服务端可以采用不同的编程语言来实现 数据序列化使用Protocol Buffers grpc社区非常活跃,版本迭代也比较快速,2019年4月11日发布了1.20.0版本 官网地址: http://www.grpc.io/ 源码地址: https://github.com/grpc grpc-nebula(Java版本)简介 微服务治理框架(Java版),基于开源项目 grpc-java 进行开发,新增如下特性: 服务自动注册与发现。采用zookeeper为注册中心,服务与注册中心之间保持长链接,具有心跳检测机制,能够周期性的检查服务的状态

通讯协议序列化解读(二) protostuff详解教程

帅比萌擦擦* 提交于 2020-11-30 03:35:52
上一篇文章 通讯协议序列化解读(一) :http://www.cnblogs.com/tohxyblog/p/8974641.html 前言 :上一面文章我们介绍了java序列化,以及谷歌protobuf,但是由于protobuf的使用起来并不像其他序列化那么简单(首先要写.proto文件,然后编译.proto文件,生成对应的.java文件),所以即使他是如何的优秀,也还是没能抢占json的份额。 这篇文章我们要介绍的是一款基于protobuf的java序列化协议——prorostuff,在java端能极大的简便使用,而且反序列化可由protobuf完成(那么前端就可以用其他语言的protobuf解码)。 一、protostuff介绍 protostuff 基于Google protobuf,但是提供了更多的功能和更简易的用法。其中,protostuff-runtime 实现了无需预编译对java bean进行protobuf序列化/反序列化的能力。protostuff-runtime的局限是序列化前需预先传入schema,反序列化不负责对象的创建只负责复制,因而必须提供默认构造函数。此外,protostuff 还可以按照protobuf的配置序列化成json/yaml/xml等格式。 在性能上,protostuff不输原生的protobuf,甚至有反超之势。 二

花椒服务端 gRPC 开发实践

混江龙づ霸主 提交于 2020-11-22 07:33:25
: 8月22日周四上午10点活动邀请 | CNCF网络研讨会:使用容器和无服务器在AWS中进行云原生开发 背景 在移动端平台开发中,为了增加代码复用,降低开发成本,通常会需要采用跨平台的开发技术,花椒也不例外。本次新的单品开发,由于时间紧,人员有限,经过调研选型,最终确定了 flutter 方案(具体选型过程不在本文讨论之内)。 为了让客户端更专注业务实现,降低接口联调测试成本,我们选用了 gRPC 方案。gRPC是一个高性能、通用的开源 RPC 框架,由 Google 开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers)序列化协议开发,且支持当前主流开发语言。gRPC通过定义一个服务并指定一个可以远程调用的带有参数和返回类型的的方法,使客户端可以直接调用不同机器上的服务应用的方法,就像是本地对象一样。在服务端,服务实现这个接口并且运行 gRPC 服务处理客户端调用。在客户端,有一个stub提供和服务端相同的方法。 gRPC 特点 基于标准化的 IDL(ProtoBuf)来生成服务器端和客户端代码,支持多种主流开发语言。同时可以更好的支持团队与团队之间的接口设计,开发,测试,协作等。 基于 HTTP/2 设计,支持双向流,多路复用,头部压缩。 支持流式发送和响应,批量传输数据,提升性能。 ProtoBuf 序列化数据抓包、调试难度较大

protobuf

元气小坏坏 提交于 2020-11-21 04:23:28
Protobuf是什么? Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储。 Protobuf的优缺点? 优点: ①相比较XML和JSON格式,protobuf更小、更快、更便捷。它以高效的二进制方式存储,比XML小3到10倍,快20到100倍。所以性能比较好,效率自然也高。 ②有代码生成机制。可以自定义数据结构,然后使用代码生成器生成的代码来读写这个数据结构。 比如你你写个一下类似结构体的内容: message test { required int32 test = 1; } 像写一个这样的结构,protobuf可以自动生成一个.cpp文件或者其他语言(Python、Java等)文件。 protobuf将对结构体test的操作封装成一个类。便于使用。 ③支持向后兼容和向前兼容。 当客户端和服务器同事使用一块协议的时候, 当客户端在协议中增加一个字节,并不会影响客户端的使用。 ④支持多种编程语言。 Protobuf目前已经支持Java,C++,Python、Go、Ruby等多种语言。 缺点 ①二进制格式导致可读性差。 为了提高性能,protobuf采用了二进制格式进行编码。这直接导致了可读性差。 ②缺乏自描述。 一般来说,XML是自描述的,而protobuf格式则不是。 给你一段二进制格式的协议内容

Goland 2020.2.3 proto3 improt 找不到当前目录的引用

倖福魔咒の 提交于 2020-11-11 10:23:04
许多文档写着 proto3 会自动索引当前目录 :) 但是当我使用 Goland 2020.2.3 时发现,并不是 要手动配置索引的目录的 因为我用的是中文版 goland 所以这里使用中文了。 文件,设置,语言和框架,Protocol Buffers, 好了,配置上自己想加的目录吧。 来源: oschina 链接: https://my.oschina.net/u/4392508/blog/4712123

如何快速获得高并发编程经验?PCC性能挑战赛作品简介及源代码

纵然是瞬间 提交于 2020-11-08 04:50:17
如何快速获得高并发编程经验?PCC性能挑战赛作品简介及源代码 PCC 是 Performance Challenge Championship (性能挑战杯)的缩写,是高可用架构后花园会员在线上组织的一个活动,由于反响热烈,考虑到线下进行可以更好的加深对高并发编程的理解,于是高可用架构在 3 月组织了本次 PCC 活动。 对于工程师来说,参加 PCC 编程挑战赛的部分意义: 体验完成一个技术小目标。高性能系统如何实现应当是每个工程师需要走的路。 学习优秀的架构方法,隔壁老王用的设计思想,可能你坐在办公室永远也无法想到。 有经验评委的点评,了解真实环境的高并发系统的追求目标。 类似主题、有同样级别参赛队员及评委参加的编程活动,可能仅此一次。 比赛方法说明 实现类似 facebook 中的 like 功能,需要: 可以对一个对象(一条feed、文章、或者url)进行 like 操作,禁止 like 两次,第二次 like 返回错误码 有 isLike 接口,返回参数指定的对象有没有被当前用户 like 过 需要看到一个对象的 like 计数 可以看到一个对象的 like 用户列表(类似 QQ 空间); 上述列表加分项:Like优先显示我的好友列表(social list)。 数据量:每天新增的 like 对象数为 1 千万,每秒 like 计数器查询量为 30 万次 / 秒。 比赛盛况

PHP环境下使用ProtoBuf

不打扰是莪最后的温柔 提交于 2020-11-05 14:59:28
前言   RPC是google公司主导的一款RPC框架,并使用protobuf作为数据传输格式,伴随gRPC框架的成熟及使用人群的增加,对于底层使用的数据格式protobuf也被越来越受到重视,而对于PHP生态而言,相关ProtoBuf介绍文档及使用资料比较少,故此写简文希望能帮助到一些有需要的同学。   ProtoBuf (Google Protocol Buffer)是由google公司用于数据交换的序列结构化数据格式,具有跨平台、跨语言、可扩展特性,类型于常用的XML及JSON,但具有更小的传输体积、更高的编码、解码能力,特别适合于数据存储、网络数据传输等对存储体积、实时性要求高的领域。   目前 官方ProtoBuf 最新版本ProtoBuf3,已经支持多种语言:C++\C#\Go\Java\Python\Ruby\Object C \Javascript\PHP,并且提供工具很方便地根据不同语言产生ProtoBuf需要的类库。   下面将通过Person数据格式作为示例进行描述如果在PHP环境中如何使用ProtoBuf3。 一、定义一个消息类型 创建一个关于Person的定义文件(以.proto为后缀),如示例为person.proto,文件内容如下: syntax = "proto3" ; package test ; message Person { string