<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    paulwong

    #

    JPA概要

    1 JPA概述

    JPA(Java Persistence API,Java持久化API),定義了對象-關系映射(ORM)以及實體對象持久化的標準接口。

    JPA是JSR-220(EJB3.0)規范的一部分,在JSR-220中規定實體對象(EntityBean)由JPA進行支持。

    所以JPA不局限于EJB3.0,而是作為POJO持久化的標準規范,可以脫離容器獨立運行,開發和測試更加方便。

    JPA在應用中的位置如下圖所示:

     

    JPA維護一個Persistence Context(持久化上下文),在持久化上下文中維護實體的生命周期。主要包含三個方面的內容:

    1. ORM元數據。JPA支持annotion或xml兩種形式描述對象-關系映射。
    2. 實體操作API。實現對實體對象的CRUD操作。
    3. 查詢語言。約定了面向對象的查詢語言JPQL(Java Persistence Query Language)。

    JPA的主要API都定義在javax.persistence包中。如果你熟悉Hibernate,可以很容易做出對應:

     
    org.hibernatejavax.persistence說明
    cfg.ConfigurationPersistence讀取配置信息
    SessionFactoryEntityManagerFactory用于創建會話/實體管理器的工廠類
    SessionEntityManager提供實體操作API,管理事務,創建查詢
    TransactionEntityTransaction管理事務
    QueryQuery執行查詢

    2 實體生命周期

    實體生命周期是JPA中非常重要的概念,描述了實體對象從創建到受控、從刪除到游離的狀態變換。對實體的操作主要就是改變實體的狀態。

    JPA中實體的生命周期如下圖:

    1. New,新創建的實體對象,沒有主鍵(identity)值
    2. Managed,對象處于Persistence Context(持久化上下文)中,被EntityManager管理
    3. Detached,對象已經游離到Persistence Context之外,進入Application Domain
    4. Removed, 實體對象被刪除

    EntityManager提供一系列的方法管理實體對象的生命周期,包括:

    1. persist, 將新創建的或已刪除的實體轉變為Managed狀態,數據存入數據庫。
    2. remove,刪除受控實體
    3. merge,將游離實體轉變為Managed狀態,數據存入數據庫。

    如果使用了事務管理,則事務的commit/rollback也會改變實體的狀態。

    3 實體關系映射(ORM)

    3.1 基本映射

     
    對象端數據庫端annotion可選annotion
    ClassTable@Entity@Table(name="tablename")
    propertycolumn@Column(name = "columnname")
    propertyprimary key@Id@GeneratedValue 詳見ID生成策略
    propertyNONE@Transient 

    3.2 ID生成策略

    ID對應數據庫表的主鍵,是保證唯一性的重要屬性。JPA提供了以下幾種ID生成策略

    1. GeneratorType.AUTO ,由JPA自動生成
    2. GenerationType.IDENTITY,使用數據庫的自增長字段,需要數據庫的支持(如SQL Server、MySQL、DB2、Derby等)
    3. GenerationType.SEQUENCE,使用數據庫的序列號,需要數據庫的支持(如Oracle)
    4. GenerationType.TABLE,使用指定的數據庫表記錄ID的增長 需要定義一個TableGenerator,在@GeneratedValue中引用。例如:

      @TableGenerator( name="myGenerator", table="GENERATORTABLE", pkColumnName = "ENTITYNAME", pkColumnValue="MyEntity", valueColumnName = "PKVALUE", allocationSize=1 )

      @GeneratedValue(strategy = GenerationType.TABLE,generator="myGenerator")

    3.3 關聯關系

    JPA定義了one-to-one、one-to-many、many-to-one、many-to-many 4種關系。

    對于數據庫來說,通常在一個表中記錄對另一個表的外鍵關聯;對應到實體對象,持有關聯數據的一方稱為owning-side,另一方稱為inverse-side。

    為了編程的方便,我們經常會希望在inverse-side也能引用到owning-side的對象,此時就構建了雙向關聯關系。 在雙向關聯中,需要在inverse-side定義mappedBy屬性,以指明在owning-side是哪一個屬性持有的關聯數據。

    對關聯關系映射的要點如下:

     
    關系類型Owning-SideInverse-Side
    one-to-one@OneToOne@OneToOne(mappedBy="othersideName")
    one-to-many / many-to-one@ManyToOne@OneToMany(mappedBy="xxx")
    many-to-many@ManyToMany@ManyToMany(mappedBy ="xxx")

    其中 many-to-many關系的owning-side可以使用@JoinTable聲明自定義關聯表,比如Book和Author之間的關聯表:

    @JoinTable(name = "BOOKAUTHOR", joinColumns = { @JoinColumn(name = "BOOKID", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "AUTHORID", referencedColumnName = "id") })

    關聯關系還可以定制延遲加載和級聯操作的行為(owning-side和inverse-side可以分別設置):

    通過設置fetch=FetchType.LAZY 或 fetch=FetchType.EAGER來決定關聯對象是延遲加載或立即加載。

    通過設置cascade={options}可以設置級聯操作的行為,其中options可以是以下組合:

    • CascadeType.MERGE 級聯更新
    • CascadeType.PERSIST 級聯保存
    • CascadeType.REFRESH 級聯刷新
    • CascadeType.REMOVE 級聯刪除
    • CascadeType.ALL 級聯上述4種操作

    3.4 繼承關系

    JPA通過在父類增加@Inheritance(strategy=InheritanceType.xxx)來聲明繼承關系。A支持3種繼承策略:

    1. 單表繼承(InheritanceType.SINGLETABLE),所有繼承樹上的類共用一張表,在父類指定(@DiscriminatorColumn)聲明并在每個類指定@DiscriminatorValue來區分類型。
    2. 類表繼承(InheritanceType.JOINED),父子類共同的部分公用一張表,其余部分保存到各自的表,通過join進行關聯。
    3. 具體表繼承(InheritanceType.TABLEPERCLASS),每個具體類映射到自己的表。

    其中1和2能夠支持多態,但是1需要允許字段為NULL,2需要多個JOIN關系;3最適合關系數據庫,對多態支持不好。具體應用時根據需要取舍。

    4 事件及監聽

    通過在實體的方法上標注@PrePersist,@PostPersist等聲明即可在事件發生時觸發這些方法。

    5 Query Language 查詢語言

    JPA提供兩種查詢方式,一種是根據主鍵查詢,使用EntityManager的find方法:

    T find(Class entityClass, Object primaryKey)

    另一種就是使用JPQL查詢語言。JPQL是完全面向對象的,具備繼承、多態和關聯等特性,和hibernate HQL很相似。

    使用EntityManager的createQuery方法:

    Query createQuery(String qlString)

    5.1 使用參數

    可以在JPQL語句中使用參數。JPQL支持命名參數和位置參數兩種參數,但是在一條JPQL語句中所有的參數只能使用同一種類型。

    舉例如下:

    • 命令參數

    Query query = em.createQuery("select p from Person p where p.personid=:Id"); query.setParameter("Id",new Integer(1));

    • 位置參數

    Query query = em.createQuery("select p from Person p where p.personid=?1"); query.setParameter(1,new Integer(1));

    5.2 命名查詢

    如果某個JPQL語句需要在多個地方使用,還可以使用@NamedQuery 或者 @NamedQueries在實體對象上預定義命名查詢。

    在需要調用的地方只要引用該查詢的名字即可。

    例如:

    @NamedQuery(name="getPerson", query= "FROM Person WHERE personid=?1")

    @NamedQueries({ @NamedQuery(name="getPerson1", query= "FROM Person WHERE personid=?1"), @NamedQuery(name="getPersonList", query= "FROM Person WHERE age>?1") })

    Query query = em.createNamedQuery("getPerson");

    5.3 排序

    JPQL也支持排序,類似于SQL中的語法。例如: Query query = em.createQuery("select p from Person p order by p.age, p.birthday desc");

    5.4 聚合查詢

    JPQL支持AVG、SUM、COUNT、MAX、MIN五個聚合函數。例如:

    Query query = em.createQuery("select max(p.age) from Person p"); Object result = query.getSingleResult(); String maxAge = result.toString();

    5.5 更新和刪除

    JPQL不僅用于查詢,還可以用于批量更新和刪除。

    如:

    Query query = em.createQuery("update Order as o set o.amount=o.amount+10"); //update 的記錄數 int result = query.executeUpdate();

    Query query = em.createQuery("delete from OrderItem item where item.order in(from Order as o where o.amount<100)"); query.executeUpdate();

    query = em.createQuery("delete from Order as o where o.amount<100"); query.executeUpdate();//delete的記錄數

    5.6 更多

    與SQL類似,JPQL還涉及到更多的語法,可以參考:http://docs.oracle.com/cd/E11035_01/kodo41/full/html/ejb3_langref.html

    6 事務管理

    JPA支持本地事務管理(RESOURCELOCAL)和容器事務管理(JTA),容器事務管理只能用在EJB/Web容器環境中。

    事務管理的類型可以在persistence.xml文件中的“transaction-type”元素配置。

    JPA中通過EntityManager的getTransaction()方法獲取事務的實例(EntityTransaction),之后可以調用事務的begin()、commit()、rollback()方法。

    Date: 2012-12-30 16:46:29 CST

    Author: Holbrook

    Org version 7.8.11 with Emacs version 24

    posted @ 2016-06-04 16:08 paulwong 閱讀(564) | 評論 (0)編輯 收藏

    IM資源

    kafka-examples視頻上的例子
    https://github.com/gwenshap/kafka-examples

    zer0MQTTServer
    https://github.com/zer0Black/zer0MQTTServer
    http://www.w2bc.com/Article/85741

    moquette
    https://github.com/andsel/moquette

    融云 Blog
    http://www.rongcloud.cn/pricing

    EMQTT
    http://emqtt.com/docs

    群聊天系統,高吞吐量,高轉發量,后端什么架構?
    http://www.v2ex.com/t/92125

    用Java實現一個IM的server端需要熟悉哪些技術點或框架?
    http://www.zhihu.com/question/37090498

    使用Java API創建(create),查看(describe),列舉(list),刪除(delete)Kafka主題(Topic)--轉載
    http://www.cnblogs.com/davidwang456/p/4313784.html

    kafka中文教程
    http://orchome.com/3

    Kafka入門經典教程
    http://www.open-open.com/lib/view/open1455842076964.html

    Kafka深度解析
    http://www.open-open.com/lib/view/open1457055194765.html

    大型網站架構系列:分布式消息隊列(一)
    http://www.open-open.com/lib/view/open1453645976605.html



    posted @ 2016-05-23 22:03 paulwong 閱讀(540) | 評論 (0)編輯 收藏

    Eclipse使用git最簡易流程

    git有諸多好處,網上都說的很清楚了,在這里我不再贅述。對于我來說,私下里想做一些項目,而又不能很好的保存自己的代碼和進行版本控制,這時候,就用到了git。下面,就以我個人為例講講git從0開始如何安裝使用。

    Step1 準備工作

    msysgit,下載地址為http://msysgit.github.io/

    Eclipse IDE for Java EE Developers(必須是這個,自帶Egit,或者自行安裝Egit插件),在Eclipse官網下載,地址http://www.eclipse.org/downloads/

    github賬號,github官網注冊一個,地址https://github.com/

    廖雪峰的git教程,地址為http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000,講得很好,我大概花了3個晚上的時間看,如果僅僅是為了安裝上,可以先暫時略過,后面再看。

    Step2 msysgit安裝

    一路next就行,注意可能會遇到360的攔截(該死,點擊允許本程序所有操作或者安裝前就退出360即可)。

    Step3 git用戶名和郵箱配置

    單擊開始菜單,打開Git Bush,

    教程1

     

    輸入以下命令

    git config --global user.name "Your Name"

    git config --global user.email email@example.com

    用戶名和郵箱替換為自己的,為本臺機器所有倉庫指定用戶名和email地址。

     

    Step4 創建SSH Key

    因為本地git倉庫和遠程的github倉庫之間是通過ssh加密的,所以,還需要創建一個SSH Key。

    輸入以下命令

    ssh-keygen -t rsa -C youremail@example.com

    同樣將郵箱替換為自己的。在路徑C盤->用戶->用戶名,找到.ssh文件夾,打開就可以看到兩個文件id_rsa和id_rsa.pub,

    打開id_rsa.pub,將其中的內容復制下來(這就相當于一把鑰匙,持有鑰匙的人可以訪問你的內容,下一個小結講解這把鑰匙的用途),下面是我的

    教程2

     

    Step5 與github上的倉庫相關聯

    注冊一個github賬號

    注冊完成之后,點擊右上角的settings(就是那個齒輪,設置的圖標)

    教程3

     

    進入設置頁面

    image

    選SSH Keys,點擊add SSH key,就可以添加了,title隨便填寫,將從id_rsa.pub中復制的內容粘貼到這里。從此,gitgub倉庫就能夠識別你本地的倉庫了。也就是說,你離將本地代碼推送到github上,或者將github上的代碼克隆到本地,就只差一步了。(可參考廖雪峰前輩的教程先進行在非Eclipse下的操作,更有感覺)

     

    Step6 Egit的使用

    首先,登入你的github賬號,點擊加號,選擇New repositrory,創建一個新的倉庫,如圖所示。

    教程6

    名字叫做test2,其他都默認就好。

    點擊綠色按鈕創建,就創建好了一個github倉庫。

    教程7

    將地址復制下來,保存好備用。

     

    打開Eclipse,像平常一樣,新建一個web工程,或者其他你常用的工程。我這里工程叫做scott

    {4$7`FVS]283EW(~80FR(JT

    右擊項目,選擇Team->Share Project,彈出如下窗口。

    image

    選擇git,next,在彈出的界面上,①先勾選Use or create……,②createrepository,③勾選工程,④finish。

    教程8

    這時候,你就創建好了一個git工程,右擊工程,選擇Team,你可以像svn一樣進行commit,synchronize等操作,但是,remote操作中,push是灰色的,表示還不能將代碼推送到github倉庫上去。

    教程10

    這時,打開Git Repository視圖(具體怎么打開百度去,這都是基本常識了)

    教程11

    右鍵選擇Create Remote,點OK

    image

    點擊Change,彈出如下界面

    image

    URI輸入之前在github上拷貝的地址,下面的內容會自動填上。你只需要再填上github上的用戶名和密碼即可。finish,save。

    接下來的幾步就簡單了,在項目里面隨便寫點代碼,然后先將新增的代碼提交到本地,例如,將cat類,先add to index,然后commit。這時候,右鍵工程,Team->remote中就有了push選項,意味著你可以將本地代碼保存在github中了。祝賀你!

    教程12

    點擊Push,點擊add All Branches Spec,將本地版本庫添加,然后Finish,后面一路Next,再次查看github,可以看到代碼已經成功推送。

    最后,看看我們在github上的代碼吧!

    作者: 張萬帆 
    歡迎任何形式的轉載,但請務必注明出處。

    posted @ 2016-05-15 18:17 paulwong 閱讀(1276) | 評論 (0)編輯 收藏

    Eclipse上安裝GIT插件EGit及使用

    一、Eclipse上安裝GIT插件EGit

     

          Eclipse的版本eclipse-java-helios-SR2-win32.zip(在Eclipse3.3版本找不到對應的 EGit插件,無法安裝)

     

         

     

     

     

    EGit插件地址:http://download.eclipse.org/egit/updates

     

    OK,隨后連續下一步默認安裝就可以,安裝后進行重啟Eclipse

     

    二、在Eclipse中配置EGit

     

    準備工作:需要在https://github.com 上注冊賬號

     

    Preferences > Team > Git > Configuration

     

     

    這里的user.name 是你在https://github.com上注冊用戶名

     

     

    user.email是你在github上綁定的郵箱。在這里配置user.name即可

     

     

    三、新建項目,并將代碼提交到本地的GIT倉庫中

     

    1、新建項目 git_demo,并新建HelloWorld.java類

     

     

    2、將git_demo項目提交到本地倉庫,如下圖

     

     

     

     

     

     

    到此步,就成功創建GIT倉庫。但文件夾處于untracked狀態(文件夾中的符號”?”表示),下面我們需要提交代碼到本地倉庫,如下圖

     

     

     

     

     

     

     

    OK,這樣代碼提交到了本地倉庫

     

     

    四:將本地代碼提交到遠程的GIT倉庫中

     

    準備工作:在https://github.com上創建倉庫

     

     

     

     

     

     

    點擊“Create repository” ,ok,這樣在github上的倉庫就創建好了。

     

    注意創建好遠程倉庫后,點擊進去,此時可以看到一個HTTP地址,如紅線框,這個是你http協議的遠程倉庫地址

     

     

    準備工作做好了,那開始將代碼提交到遠程倉庫吧

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    OK,這樣提交遠程GIT就完成了,可以在https://github.com核對一下代碼是否已經提交

     

     

    注意的問題

       如果是首次提交會第一步:先在本地建立一個一樣的倉庫,稱本地倉庫。

              第二步:在本地進行commit操作將把更新提交到本地倉庫;

              第三步: 將服務器端的更新pull到本地倉庫進行合并,最后將合并好的本地倉庫push到服務器端,這樣就進行了一次遠程提交。

     

      如果非首次提交同樣的道理

              第一步:將修改的代碼commit操作更新到本地倉庫;

             第二步:第三步: 將服務器端的更新pull到本地倉庫進行合并,最后將合并好的本地倉庫push到服務器端

     

     

    posted @ 2016-05-15 17:46 paulwong 閱讀(537) | 評論 (0)編輯 收藏

    排版六原則


    作者: 阮一峰

    日期: 2010年10月16日

    上個月,我貼了《圖形化簡歷》

    幾天后,就收到了秋葉老師的來信,希望與我探討一些設計問題。他寫過一本暢銷書《說服力-讓你的PPT會說話》,眼下正在寫續集。

    我看了新書的樣章,覺得很不錯,有些內容很值得分享。

    ====================================

    首先,我們先看一個例子。良好的設計如何使得一個平庸的文檔脫胎換骨。下面是一張大學生的求職簡歷,再普通不過了,想要引起招聘經理的注意,恐怕很難。

    秋葉老師對它進行了簡單的排版,還是一張表格,還是黑白配色,沒有使用任何圖形元素,效果卻完全不一樣了。

    真是令人眼前一亮,不由自主地想多看幾眼。這就是優秀設計的作用:它讓你脫穎而出。

    ====================================

    秋葉老師把他的排版心得,總結為六個原則:對齊,聚攏,重復,對比,強調,留白。我是這樣理解的:

    一、對齊原則

      相關內容必須對齊,次級標題必須縮進,方便讀者視線快速移動,一眼看到最重要的信息。

    二、聚攏原則

      將內容分成幾個區域,相關內容都聚在一個區域中。段間距應該大于段內的行距。

    三、留白原則

      千萬不要把頁面排得密密麻麻,要留出一定的空白,這本身就是對頁面的分隔。這樣既減少了頁面的壓迫感,又可以引導讀者視線,突出重點內容。

    四、降噪原則

      顏色過多、字數過多、圖形過繁,都是分散讀者注意力的"噪音"。

    五、重復原則

      多頁面排版時,注意各個頁面設計上的一致性和連貫性。另外,在內容上,重要信息值得重復出現。

    六、對比原則

      加大不同元素的視覺差異。這樣既增加了頁面的活潑,又方便讀者集中注意力閱讀某一個子區域。

    ====================================

    下面用一個PPT的例子,演示排版六原則。

    上面這張ppt有兩個毛病。一是字數太多,抓不住重點;二是右邊沒有對齊,使得讀者的視線只能一行行地從行首到行尾移動,不能直上直下。

    現在進行修改。

    第一步,根據"聚攏原則",將六點分成六個區域。

    第二步,根據"降噪原則",將每一點分成"小標題"和"說明文字"兩部分。

    第三步,根據"對齊原則",將每一個部分、每一種元素對齊。

    第四步,根據"對比原則",加大"小標題"和"說明文字"在字體和顏色上的差異。

    第五步,根據"留白原則",留出一定的空白。

    頁面的可讀性大大增加。

    (完)

    posted @ 2016-05-06 17:55 paulwong 閱讀(422) | 評論 (0)編輯 收藏

    MyThrift 0.0.1 發布,輕量級 RPC 服務框架

    1)什么是MyThrift?

    基于以下組件打造的一款輕量級RPC服務框架:thrift(facebook出品)、commons-pool(socket連接池)、自研服務治理框架(zookeeper).

    2)為什么要寫MyThrift?

    2.1)提出問題:

        各種存儲越來越多(redis,mysql,hdfs,hbase,mq),

        讓web開發人員自己訪問存儲,并保證性能,是一件高要求的事情。

        造成的結果就是軟件開發進度緩慢,性能低下,各種bug.

    2.2)分析問題:

        RPC框架:考慮到本人看過thrift的源碼,尤其是針對網絡模塊非常熟悉,并在實際生產環境中使用過,thrift性能不錯。

        TCP/IP:有過2年的TCP/IP報文分析經驗,從鏈路層到應用層都很熟悉。

        ZooKeeper:在MySQL-Binlog項目中攢出了一些使用經驗,同時積極吸收Motan,JACK,HArpc等兄弟軟件的優秀理念部分。

        連接池:使用commons-pool連接池組件。

    2.3)解決問題:

        糅合thrift,zookeeper,commons-pool打造一款輕量級、性能高、上手容易的rpc調用框架,

        使得架構師和后臺開發人員可以將各種復雜存儲的IO訪問對外暴露為服務(其實就是跨機器的普通函數調用)

        這樣web開發人員可以專注于業務邏輯,加速產品迭代,對企業帶來的好處不用多說!

    本次版本內容:

    1)server端進行網絡模型參數調優

    2)client端有連接池

    3)支持server注冊多個thrift的處理器Processor

    可用于集中式負載的服務化組件,達到生產環境級別,經歷過生產環境的考驗,可放心使用。

    http://git.oschina.net/qiangzigege/MyThrift 

    內附非常詳細+多圖預警的《MyThrift在線使用文檔.md》,0基礎輕松上手!

    posted @ 2016-05-05 17:02 paulwong 閱讀(1645) | 評論 (0)編輯 收藏

    Couchbase介紹,更好的Cache系統

    在移動互聯網時代,我們面對的是更多的客戶端,更低的請求延遲,這當然需要對數據做大量的 Cache 以提高讀寫速度。

    術語

    • 節點:指集群里的一臺服務器。

    現有 Cache 系統的特點

    目前業界使用得最多的 Cache 系統主要是 memcached 和 redis。 這兩個 Cache 系統都有都有很大的用戶群,可以說是比較成熟的解決方案,也是很多系統當然的選擇。 不過,在使用 memcached 和 redis 過程中,還是碰到了不少的問題和局限:

    • Cluster 支持不夠。在擴容、負載均衡、高可用等方面存在明顯不足。
    • 持久化支持不好,出現問題后恢復的代價大。memcached 完全不支持持久化,redis 的持久化會造成系統間歇性的負載很高。

    我期待的理想 Cache 系統

    良好的 cluster 支持

    • Key 可以動態分散(Auto Sharding)在不同的服務器上,可以通過動態添加服務器節點增加系統容量。
    • 沒有單點失效,任何一個單點都不會造成數據不可訪問。
    • 讀寫負載可以均勻分布在系統的不同節點上。

    支持異步持久化支持

    • 方便快速恢復,甚至可以直接用作 key/value 數據庫。 經常在跟業界朋友交流時,會提到用 key 分段的方法來做容量擴展以及負載均衡。但是用靜態的 key 分段會有不少問題:
    • Cache 系統本身及使用 cache 的客戶端都需要預設一個分段邏輯,這個邏輯后期如果需要調整將會非常困難。不能解決單點失效的問題,還需要額外的手段。運維需要更多的人為參與,避免 key 超出現有分區,一旦出現 key 找不到對應服務器,訪問直接失敗。

    最接近需求的系統:Couchbase

    基于這些想法,我花了幾天時間在 google, stack overflow, quora 上看了很多大家關于 cache cluster 的討論,找到一個比較新系統 Couchbase。

    mem vs cbmemcached VS couchbase

    Couchbase 的集群設計對等網

    Couchbase 群集所有點都是對等的,只是在創建群或者加入集群時需要指定一個主節點,一旦結點成功加入集群,所有的結點對等。

    high_level_architecture

    圖片來源:couchbase.com

    對等網的優點是,集群中的任何節點失效,集群對外提供服務完全不會中斷,只是集群的容量受影響。 Smart Client

    由于 couchbase 是對等網集群,所有的節點都可以同時對客戶端提供服務,這就需要有方法把集群的節點信息暴露給客戶端,couchbase 提供了一套機制,客戶端可以獲取所有節點的狀態以及節點的變動,由客戶端根據集群的當前狀態計算 key 所在的位置。 vBucket

    vBucket 概念的引入,是 couchbase 實現 auto sharding,在線動態增減節點的重要基礎。

    簡單的解釋 vBucket 可以從靜態分片開始說起,靜態分片的做法一般是用 key 算出一個 hash,得到對應的服務器,這個算法很簡單,也容易理解。如以下代碼所示:

    servers = ['server1:11211', 'server2:11211', 'server3:11211'] server_for_key(key) = servers[hash(key) % servers.length] 

    但也有幾個問題:

    • 如果一臺服務器失效,會造成該分片的所有 key 失效。
    • 如果服務器容量不同,管理非常麻煩。
    • 前面提到過,運維、配置非常不方便。

    為了把 key 跟服務器解耦合,couchbase 引入了 vBucket。可以說 vBucket 代表一個 cache 子集,主要特點:

    • key hash 對應一個 vBucket,不再直接對應服務器。
    • 集群維護一個全局的 vBucket 與服務器對應表。
    • 前面提到的 smart client 重要的功能就是同步 vBucket 表。

    如以下代碼所示:

    servers = ['server1:11211', 'server2:11211', 'server3:11211'] vbuckets = [0, 0, 1, 1, 2, 2] server_for_key(key) = servers[vbuckets[hash(key) % vbuckets.length]] 

    vBucket

    圖片來源:http://dustin.sallings.org/2010/06/29/memcached-vbuckets.html

    由于 vBucket 把 key 跟服務器的靜態對應關系解耦合,基于 vBucket 可以實現一些非常強大有趣的功能,例如:

    • Replica,以 vBucket 為單位的主從備份。如果某個節點失效,只需要更新 vBucket 映射表,馬上啟用備份數據。
    • 動態擴容。新增加一個節點后,可以把部分 vBucket 轉移到新節點上,并更新 vBucket 映射表。

    vBucket 非常重要,以后可以單獨寫一篇文章分享。

    總結

    • Couchbase 的對等網設計,smart client 直接獲取整的集群的信息,在客戶端實現負載均衡,整個集群沒有單點失效,并且完全支持平行擴展。
    • vBucket 的引入,完全實現了 auto sharding,可以方便靈活的把數據的子集在不同節點上移動,以實現集群動態管理。
    • Couchbase 有一個非常專業的 web 管理界面,并且支持通過 RESTful API 管理,這也是 memcached, redis 不能企及的。
    • 如果只是做 key/value 的 cache,Couchbase 可以完全取代 memcached。
    • Couchbase 已經被我們在生產環境中大量采用。

    posted @ 2016-05-04 15:00 paulwong 閱讀(582) | 評論 (0)編輯 收藏

    [轉]巔峰對決 - 框架的性能比較

    轉自:http://colobu.com/2016/04/25/performance-comparison-of-frameworks/
    這句話也可以應用在軟件開發上,"無快不破"強調的是軟件的性能。我陸陸續續寫了多篇各種框架的文章,也在github上開了多個性能比較的開源項目,本文做一個匯總,以備將來的查找。

    1. 最快的web服務器
    2. 最快的并發框架
    3. 最快的RPC服務器
    4. 最快的websocket框架
    5. 最快的RESTful框架
    6. 最快的Go序列化框架
    7. 最快的Go web框架
    8. 最快的Java序列化框架

    posted @ 2016-05-03 14:36 paulwong 閱讀(557) | 評論 (0)編輯 收藏

    輕量級 RPC 框架新浪微博的 motan

    概述

    motan是一套高性能、易于使用的分布式遠程服務調用(RPC)框架。

    功能

    • 支持通過spring配置方式集成,無需額外編寫代碼即可為服務提供分布式調用能力。

    • 支持集成consul、zookeeper等配置服務組件,提供集群環境的服務發現及治理能力。

    • 支持動態自定義負載均衡、跨機房流量調整等高級服務調度能力。

    • 基于高并發、高負載場景進行優化,保障生產環境下RPC服務高可用。

    文檔索引

    posted @ 2016-04-25 14:22 paulwong 閱讀(2078) | 評論 (1)編輯 收藏

    dubboss

    HTTPCLIENT請求基于NETTY的HTTP服務器,NETTY生成相關的HTTPREQUEST、HTTPRESPONSE,調用SPRING 的DISPATCHSERVLET.SERVICE,將HTTPRESPONSE生成二進制字節,返回HTTPCLIENT。DISPATCHSERVLET同時會調用SPRING的CONTROLLER干活,即以前的SPRING MVC那套可以保留。

    缺點:
    nginx+tomcat與netty優缺點
    http://www.oschina.net/question/1765708_158026

    我的架構最開始是 nginx + [netty (tcp) ] 用nginx做負載均衡。后來分布式接口變成了http restful -> nginx + [netty(http) ]

    于是參考了netty的官方http例子,開始移植代碼,其實移植量不大,只需要把原來的tpc handler里面的邏輯放到http handler里面就可以了。本以為ok了,測試才發現了大量的問題,其實問題本身是由于對http基礎掌握的還不夠透徹,比如keep-alive屬性,這個平時基本不用的東西,當你要自己開發http server時,變的很有用,你不能每次都close channel.你要化很多時間了解header里面每個字段的意思,然后去實現它。再比如一個post請求,你要自己寫代碼從body里面讀數據,解碼等。

    最終我放棄了netty,回到了tomcat.應為tomcat把http的一切都幫你搞定了。

    最終的架構是 nginx + [tomcat(http) ]

    tomcat就是針對http層的,所以我建議http還是選擇tomcat(或者其他成熟的http-server),并不是說netty不好,而是你的選擇問題,netty是一個網絡組件,tcp,udp,http都可以弄,但是官方文檔都是些hello wolrd級別的。如果你非常了解http結構,完全可以基于netty搞出一個比tomcat牛的http server.

    如果做tcp開發,netty不二之選!

    dubboss是一個分布式REST服務的框架,實現了如下功能:

    • 基于dubbo的RPC
    • 基于netty的應用服務器
    • 基于springmvc的REST調用
    • 基于ngnix的負載均衡

    https://github.com/leiguorui/dubboss

    posted @ 2016-04-20 13:04 paulwong 閱讀(1703) | 評論 (0)編輯 收藏

    僅列出標題
    共115頁: First 上一頁 29 30 31 32 33 34 35 36 37 下一頁 Last 
    主站蜘蛛池模板: 亚洲私人无码综合久久网| a毛片成人免费全部播放| 亚洲成a人片在线观看日本| 成人性生免费视频| 免费人成在线观看网站品爱网| 男人j进女人p免费视频| 亚洲欧洲日本在线观看| 精品亚洲成AV人在线观看| 亚洲国产精品无码专区影院| 亚洲国产精品国产自在在线 | 亚洲国产日韩在线| 亚洲av永久无码精品网站| 亚洲午夜AV无码专区在线播放| 黄网址在线永久免费观看 | 亚洲视频免费在线看| 亚洲精品乱码久久久久66| 亚洲综合激情另类专区| www.亚洲一区| 又黄又大又爽免费视频| 日本视频免费在线| 成人av免费电影| 成人激情免费视频| 成全视频在线观看免费高清动漫视频下载 | 免费看黄的成人APP| 成人一区二区免费视频| 久久国产精品免费| 国产免费黄色无码视频| 在线视频网址免费播放| 黄 色一级 成 人网站免费| 国产免费福利体检区久久| 国产在线观看无码免费视频| 国产成人自产拍免费视频| gogo免费在线观看| 三级黄色片免费看| 青青青国产手机频在线免费观看| 中文字幕免费不卡二区| 日韩精品内射视频免费观看| 久久午夜夜伦鲁鲁片无码免费| 中文字幕在线免费观看| 午夜性色一区二区三区免费不卡视频| 日本XXX黄区免费看|