thrift中使用list數據類型傳輸大數據瓶頸及解決方案

董的博客中thrift相關基礎的介紹:http://dongxicheng.org/search-engine/thrift-rpc/html

thrift碰到大list時瓶頸的緣由:數據結構

        由於thrift協議中server和client的交互使用的是序列化的數據。當你使用thrift --gen cpp  **.thrift 產生一個符合你使用場景的數據結構時,該數據結構都會對應了thrift中的相應的序列化的結構來序列化它。對於list類型數據結構的序列化thrift分三部:函數

        體如今write_virt函數的調用上,第一次寫入1,第二次寫入2,第三次8。若是你的list數據長度爲一千多萬,那麼每一個都對應了一個write_virt,每一個write_virt都有響應的memcpy操做,這個是很耗時的。ui

解決方案:server

        把list這種結構的數據進行序列化,使用thrift傳輸binary類型的數據,這樣即可以解決thrift序列化list慢的問題。由於thrift對binary類型的數據序列化使用的是整塊拷貝,不像list是分塊拷貝。htm

其中將list序列化的部分我使用的是boost的序列化方式。blog

有關數據序列化的問題我使用的是boost的序列化方式rpc

boost序列化使用方面比較不錯的文章:博客

IBM講解序列化的方法:http://www.ibm.com/developerworks/cn/aix/library/au-boostserialization/it

一個使用二進制序列化的實例:http://www.cppblog.com/liquidx/archive/2009/06/18/88007.html

轉載請註明做者:xidianwlc 

相關文章
相關標籤/搜索