發表文章

輕探WebFlux

圖片
本來標題是想寫輕探春日流轉的,想想還是算了。 程式碼 在此 ,您可以先git clone下來備用。 Spring 5 後來始導入non-blocking IO、reactive backpressure的Web開發方式;僅管Spring官方稱WebFlux不會比Servlet快到哪去,但實際面臨到需要I/O的情況下,理論上總是會快一點,像用reactor netty抓網頁的方式,我感覺就是比Apache HttpClient來的快些。  轉到WebFlux首先要面臨的就是Servlet不再,沒了JSP,也沒了JSTL,一開始真的很難習慣,忽然發現一堆Listener沒得用,也沒辦法 Wrap Servlet Request,但為了或許能快那麼一點點,總是得付出些代價。  在學習的過程式,覺得困難點大概有三,分別是Web轉換、Secuity應用與WebSocket管控,我想就這幾點來說明如果克服(至於如何寫Reactive,不想在這裡多說, projectreactor.io 可以瞭解一下,網路也有一堆教學文件)。  首先要面臨的是 Web撰寫方式的轉換 : Spring boot 提供了一堆 spring-boot-starter-xxxx,可以很方便的開始一個專案,優點是快速,缺點是引用了一堆可能用不到的Libraries,我並不打算以此為進入點。 WebFlux在少了Container的情況下,註定以應用程式的方式存在,而應用程式的方式就是採用ApplicationContext去載入一些程式設定 ``` Main.java ``` 所以AppConfig.java就是設定的進入點,上述程式載入設定後,隨即就是啟動HttpServer。 ``` AppConfig.java ``` @Configuration不用多說,寫過Spring程式的人都應該知道 。 至於@ImportResource,嗯!我是念舊的人,習慣把設定放在XML內(從Ver 3開始養成的), applicationContext.xml 包含了Component Scan 與 thymeleaf (取代JSP)的一些設定。 AppConfig.java 依序載入了Web設定、資料庫設定、安全性設定與WebSocket設定。 WebConfig.java 包含了WebFlux運作的基

數值轉大寫

兩年前有陣子上Leetcode試玩了一下。 其中有一題 Integer to Roman , 沒想到兩年多了還是維持在最快(3ms, 再快真的不容易) 程式碼如下: class Solution { public String intToRoman ( int num ) { int [ ] nums = new int [ ] { 1000 , 900 , 500 , 400 , 100 , 90 , 50 , 40 , 10 , 9 , 5 , 4 } ; String [ ] rns = new String [ ] { "M" , "CM" , "D" , "CD" , "C" , "XC" , "L" , "XL" , "X" , "IX" , "V" , "IV" } ; StringBuilder sb = new StringBuilder ( ) ; int pos = 0 ; while ( num > 3 && pos < rns. length ) { int d = num / nums [ pos ] ; int r = num % nums [ pos ] ; if ( d > 0 ) { for ( int i = 0 ; i < d ; i ++ ) { sb. append ( rns [ pos ] ) ; } } else { pos ++; } num = r ; } while

Postgresql HA

圖片
關於Postgresql HA,建議閱讀 這篇文章 ,摘要如下: Standby databases 主要資料庫的備分,有著與主要資料庫相同的資料,以備意外發生。 以複製方式分類 Physical standbys :硬碟區塊複製 Logical standbys :變動資料串流複製 以transaction同步分類: 異步 :可能會掉資料 同步 :不可能掉資料,master會等待standby複製完成通知 以用途分類 Warm standbys :standby機不提供連線 Hot standbys :standby機提供唯讀查詢連線 叢集 多個主機視為一體,叢集規模可調整,任一節點掛點不影響作業,依資料共用可分類如下: Shared-storage :所有節點共享資料 Shared-nothing :每個節點有自已的儲存,所以不一定會資料相同 然後是我比較關注的免費產品介紹: Ruberep 異步、多master與多平台解決方案,適用於Postgresql與MySQL,奠基於trigger,不支援DDL、User與Grants Pgpool II 是個中介軟體。主要功能如下: Connection pool Replication Load balancing Automatic failover Parallel queries Limiting Exceeding Connections Bucardo 描述功能看起來很強大,但缺點也不少,暫不考慮 PostgresXL 只能用一個awesome形容,PostgressXL屬於企業集架構的大型叢集,前身是 Postgres-XC ,功能強大, 效能卓越 ,但因為採用shared nothing、分散式表格儲存(也就是多筆資料會分別儲存到不同節點,所以她的查詢是採平行處理,速度快,但也就是節點要比較多),成本相對也不便宜。 這裡有人做了個 Lab 可以參考。 另外Postgres官方也列出了各種HA,Load Balance與複製方式的 比較表 : 看起來pgpool-II是個不錯的選擇,以下是個合適的架構 pgpoo-II有多種