关于高性能:thrift的网络传输性能和需要注意的问题
起源:thrift的网络传输性能和须要留神的问题thrift应该是目前反对编程语言品种最多的跨语言 rpc服务框架, http://thrift.apache.org/ thrift实现了残缺的网络服务,所以个别应用thrift时,会应用到thrift的服务框架。当然,也能够用本人曾经实现的网络服务,用io流对接thrift接口的输入输出流实现thrift的接入。 无论是用thrift的网络实现,还是本人实现的网络服务,只有对接thrift,在调用thrift接口实现rpc时,都是走thrift的网络传输方式。 thrift的网络传输实现形式 不适宜也不反对压力较大的网络传输需要。实际上,调用一次thrift接口,并不是只调一次网络io写数据,而是拆分为屡次写数据传送。 调用一个thrift 的接口发送数据时,thrift会将这个操作拆分为几个操作: 调用thrift的办法时:thrift会找到这个办法所在的对象,调用write办法, 在write办法在,别离对各个参数,顺次调用 writeFieldBegin,writeXXX(具体参数类型) ,WriteFieldStop 等函数每次调用也同时调用网络io写相应数据. 以目前最新的thrift-0.18.1实现为例 比方 go的实现: func (p *ItnetPonMergeArgs) Write(ctx context.Context, oprot thrift.TProtocol) error { if err := oprot.WriteStructBegin(ctx, "PonMerge_args"); err != nil { return thrift.PrependError(fmt.Sprintf("%T write struct begin error: ", p), err) } if p != nil { if err := p.writeField1(ctx, oprot); err != nil { return err } if err := p.writeField2(ctx, oprot); err != nil { return err } } if err := oprot.WriteFieldStop(ctx); err != nil { return thrift.PrependError("write field stop error: ", err) } if err := oprot.WriteStructEnd(ctx); err != nil { return thrift.PrependError("write struct stop error: ", err) } return nil}//第一个参数func (p *ItnetPonMergeArgs) writeField1(ctx context.Context, oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin(ctx, "pblist", thrift.LIST, 1); err != nil { //WriteFieldBegin return thrift.PrependError(fmt.Sprintf("%T write field begin error 1:pblist: ", p), err) } if err := oprot.WriteListBegin(ctx, thrift.STRUCT, len(p.Pblist)); err != nil { return thrift.PrependError("error writing list begin: ", err) } for _, v := range p.Pblist { if err := v.Write(ctx, oprot); err != nil { return thrift.PrependError(fmt.Sprintf("%T error writing struct: ", v), err) } } if err := oprot.WriteListEnd(ctx); err != nil { return thrift.PrependError("error writing list end: ", err) } if err := oprot.WriteFieldEnd(ctx); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 1:pblist: ", p), err) } return err}//第二个参数,操作相似第一个参数func (p *ItnetPonMergeArgs) writeField2(ctx context.Context, oprot thrift.TProtocol) (err error) { if err := oprot.WriteFieldBegin(ctx, "id", thrift.I64, 2); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field begin error 2:id: ", p), err) } if err := oprot.WriteI64(ctx, int64(p.ID)); err != nil { return thrift.PrependError(fmt.Sprintf("%T.id (2) field write error: ", p), err) } if err := oprot.WriteFieldEnd(ctx); err != nil { return thrift.PrependError(fmt.Sprintf("%T write field end error 2:id: ", p), err) } return err}调用Pon(ItnetPonMergeArgs)办法的thrift传输程序是: ...