【轉】如何減少接口響應時間

Premature optimization is the root of all evil.

  — Donald Knuth

對于程序優化,我一直采取保守的態度,除非萬不得已。但是隨著業務的不斷發展,程序越來越復雜,代碼越寫越多,優化似乎是終有一天會到來的事情。

那么對于一個典型的后臺服務接口,我們可以從那些方面入手進行優化呢?

接口拆分

接口垂直拆分

垂直拆分可以簡單理解為微服務化,把一個大而復雜的服務拆分成多個相互獨立,職能單一的服務,單獨部署。 更細粒度拆分的好處是,能對某個具體的微服務進行特殊優化,以最大的投入產出比來解決整個服務的性能。 垂直拆分還有一個好處是,對于非必須的接口,可以很方便的進行降級處理,把壞影響隔離到核心邏輯外部。 最容易想到的優化辦法是把某個對整體性能有決定性影響的微服務接口進行水平擴容。

注意: 拆分后必定會增加外部接口調用,多少會有些額外開銷,但是對于有限幾個調用,拆分的還是值得的。

接口水平拆分

這里說的水平拆分一定不是把一個接口部署更多份,因為這樣只能解決接口的容量問題,但是不能減少接口的響應時間。 水平拆分可以簡單理解成mapreduce模型,把整個計算邏輯或者數據平均分配到集群中的N個服務器去,然后由一臺機器去并發調用并做結果合并。 理論上這種方式能把響應減少到1/N+合并+調用開銷的時間。

注意: 一個問題需要考慮的是,如果并發調用的接口返回的數據量比較大,可能會對合并機器的網絡負載和數據序列化(CPU)有一定影響。

緩存

接口緩存

一個有著復雜邏輯或者大量計算數據的接口,能對整個結果進行緩存再好不過了。緩存針對不同的場景會有多種策略,對于有大量并發請求的場景, 推薦一個方案:一種基于“哨兵”的分布式緩存設計,不會有損失第一個用戶,也不會有定時更新緩存的額外開銷。

本地緩存

本地緩存有兩種場景,對于類似字典類型的數據,可以靜態化后放入內存,定時去刷新或者采用通知機制去更新。

還有一種場景是用ThreadLocal緩存重復內部計算與重復的對象創建; 對于鏈路比較長或者循環比較深的接口,ThreadLocal減少重復計算和對象創建,從而降低RT和節約內存。

注意: 在有內部并發的地方使用ThreadLocal一定要注意不同線程間的數據同步。主線程的ThreadLocal數據和每個并發子線程的ThreadLocal數據要同步好。

內部優化

非核心流程異步化

類似于發消息,寫日志,更新緩存等不會影響接口準確性的非核心流程,可以采用異步方式進行處理,不阻塞主計算邏輯處理。

內部并發

如果進行水平拆分后,并發調用IO較大,可以考慮換成內部并發解決IO問題。如果內部并發涉及到每個線程更新同一個集合數據,不用忘了使用線程安全的集合。 這里有一個并發更新HashMap的case:并發環境下HashMap引起full gc排查。

總結

優化一定不是一蹴而就的,整個優化過程是一個統計-->方案-->驗證的閉環,需要不斷試錯,不斷挖掘,最終達到預期。

轉自:http://blog.lichengwu.cn/optimization/2016/03/12/how-to-reduce-the-computational-response-time/

轉載于:https://www.cnblogs.com/yunspider/p/5274764.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373439.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據庫行轉列在現實需求中的用法

select t.客戶姓名,sum(case when t.收款類型首款 then t.金額 else 0 end as 首款),sum(case when t.收款類型尾款 then t.金額 else 0 end as 尾款) from table t group by t.客戶姓名 這段sql的意思 是 查詢出所有客戶收款信息 然后按客戶分組 分組后 然后將這個客戶的所…

mysql生產環境加索引_【生產篇】_MySQL環境下如何查看基于表的索引定義

【引言】今天中午項目組來一需求,欲在MySQL環境的某張表下創建幾個BTREE索引。要創建索引,首先需要了解基表的表結構,以及已經包含的索引。Oracle的表結構大家都很熟悉,但MySQL表結構和已創建索引的查看怎么操作,本文將…

Hadoop模式介紹-獨立,偽分布式,分布式

了解了什么是Hadoop之后,讓我們在單機上啟動Hadoop: 這篇文章包含在ubuntu上安裝Hadoop的說明。 這是Hadoop安裝的快速分步教程。 在這里,您將獲得以獨立模式 (單節點集群)安裝Hadoop所需的所有命令及其說明&#xff0…

apk反編譯方式

一、Apk反編譯得到Java源代碼 下載上述反編譯工具包,打開apk2java目錄下的dex2jar-0.0.9.9文件夾,內含apk反編譯成java源碼工具,以及源碼查看工具。 apk反編譯工具dex2jar,是將apk中的classes.dex轉化成jar文件 源碼查看工具jdgui…

優化Hibernate所鼓勵的7大措施

優化Hibernate所鼓勵的7大措施: 1.盡量使用many-to-one,避免使用單項one-to-many2.靈活使用單向one-to-many3.不用一對一,使用多對一代替一對一4.配置對象緩存,不使用集合緩存5.一對多使用Bag 多對一使用Set6.繼承使用顯示多態 HQ…

如何用c 控制mysql數據庫_用C語言操作MySQL數據庫

函數描述mysql_affected_rows()返回上次UPDATE、DELETE或INSERT查詢更改/刪除/插入的行數。mysql_autocommit()切換autocommit模式,ON/OFFmysql_change_user()更改打開連接上的用戶和數據庫。mysql_charset_name()返回用于連接的默認字符集的…

數據結構(RMQ):POJ 3624 Balanced Lineup

Balanced LineupDescription For the daily milking, Farmer Johns N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a conti…

Apache Thrift快速入門教程

Thrift是一種跨語言RPC框架,最初是在Facebook上開發的,現在作為Apache項目開源。 這篇文章將描述如何以不同的模式(例如阻塞,非阻塞和異步)編寫Thrift服務和客戶端。 (我覺得后兩種模式的文檔較少&#xff…

數組拆分為新數組

package com.classes;//已知數組a,將奇數位置元素存到b數組中,偶數位置元素存到c數組中public class Shuzu1118_4 { public static void main(String[] args) { int [] a{3,6,9,1,4,7,2,5,8}; int [] b; //定義數組b int [] c; //定義數組c//先找出數組…

java數組交集_java數組的交集和并集

前兩天給我出了一道題,求數組的并集和交集,然后我試著寫一下,很尷尬,由于長時間沒有寫過代碼,一開始數組是如何定義的給忘了。當時我說了我的思路,不過也是很low的做法,查閱網上的一些資料&…

ADF聲明性組件示例

在我以前的文章中,我答應展示如何為智能值列表創建ADF聲明性組件。 因此,我將創建一個包含三個元素的組件:標簽,輸入文本和值的組合框列表。 那很容易。 我在工作空間中創建了一個單獨的ADF ViewController項目: 在此項…

VS2015 安裝包缺失(聯網安裝失敗)問題解決

Win7 x86 測試可行 * 如果前面有嘗試過安裝不成功, 一定要用卸載程序刪除已安裝的部分,否則會出亂子. 1. 或者是用虛擬光驅加載ISO, 或者是解壓到硬盤上, 都沒有關系. 2. 用管理員權限啟動CMD控制臺, 進入VS2015 安裝盤的根目錄 (vs_enterprise.exe 所在的目錄). 3. 執行命令 …

java藍橋暑假班_Java實現 藍橋杯VIP 算法提高 班級排名

算法提高 班級排名時間限制:1.0s 內存限制:256.0MB問題描述達達在陶陶的影響下,也對學習慢慢的產生了興趣。他在每次考試之后,都會追著老師問,自己在班級的總名次是多少。考試一多,老師也不耐煩了&#xff…

$.ajax所犯的錯誤。success后面不執行

$.ajax({ type: post, url: ../AshxHandler/HandlerAddPhoto.ashx, data: { clientPath: photoName }, dataType: text, cache: false, success: function (data) { alert(1); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(上傳圖片出現錯誤&#xf…

WhateverOrigin –與Heroku和Play對抗相同的原產地政策! 構架

不久前,我在編碼 Bitcoin Pie時發現需要克服臭名昭著的Same Origin Policy ,該政策限制了運行在客戶端瀏覽器上的javascript可以訪問的域。 通過Stack Overflow,我找到了一個名為Any Origin的站點,這基本上是無需設置專用服務器即…

Solr集群更新配置的方式

solr集群中配置文件是經常更新的,頻率最高的也就是schema.xml和solrconfig.xml這兩個配置文件了,對于更新配置文件之前,我們先了解一下集群項目結構 由于在集群模式下,solrconfig.xml和schema.xml等配置文件都由Zookeeper集群管理…

java文本框雙擊可編輯_java swing 文本域雙擊變為可編輯

java swing如何實現文本域雙擊變為可編輯呢?給文本域添加鼠標事件監聽程序即可:resultTA1new AssistPopupTextArea();resultTA1.setEditable(false);resultTA1.setLineWrap(true);resultTA1.setWrapStyleWord(true);resultTA1.addMouseListener(new MouseAdapter() {Overridep…

點擊出現黑色背景的解決

-webkit-tap-highlight-color:rgba(0,0,0,0);轉載于:https://www.cnblogs.com/luckyXcc/p/6085582.html

OSGi簡介–模塊化Java

OSGi聯盟是這一擱淺的管理機構,它始于1999年。其最初目標是為網絡設備創建開放擱淺。 基于此思想,此規范也針對Java引入。 Eclipse在Java中是第一個。 他們于2004年6月推出了基于OSGi的Eclipse IDE。 OSGi是在Java中定義動態模塊的方法。 主要為Java實現…

HDU FatMouse's Speed 基本DP

題意:要求找到的體重遞增,速度遞減的老鼠,并且輸出最長的長度數,而且輸出各自的序列數。Special Judge 思路:先按體重由小到大排序,再找最長速度遞減序列。 轉移方程:mou[i].w>mou[j].w&am…