<address id="ttjl9"></address>

      <noframes id="ttjl9"><address id="ttjl9"><nobr id="ttjl9"></nobr></address>
      <form id="ttjl9"></form>
        <em id="ttjl9"><span id="ttjl9"></span></em>
        <address id="ttjl9"></address>

          <noframes id="ttjl9"><form id="ttjl9"></form>

          首頁

          零基礎學習UI設計到底需要學些什么?

          藍藍設計的小編

          在進入一個未知的范疇前,一定要先梳理這個范疇的架構,待有了對比全部認知后再深挖。學習UI規劃也是相同,假如有條件,能夠嘗試了解一個新的互聯網商品出爐的作業流程。

          微交互|只要關注這6個點,交互設計師也能做好競品分析!

          資深UI設計者

          今天我們來聊聊競品分析,它并不是像人們認為的那樣——有統一的模板,因為針對不同的崗位,做的競品分析是不同的。所以本文聊的是:交互設計師如何做競品分析。
          競品分析是對產品、交互從業人員最基本的技能要求之一,很多剛入行的產品汪、交互喵首先要做的都是競品分析,一來可以考考你的底子,二來可以鍛煉你的邏輯思維。雖然它是基本技能,但是它的作用卻非常大。
          那有什么作用呢?當你設計了一個功能,別人問你為什么這么設計時,你的答案要非常專業,而不是說“我覺得……”,這時候競品分析就派上用場了。
          做競品分析,可以避免相關設計人員站在自己的角度去思考問題,在評審的時候容易通過且能夠獲得大家的認同,而不會受到來自各方的質疑,這也是那么多人做競品分析的原因之一。
          當然,站在產品和運營的角度來說,做競品分析還能開拓市場、優化產品、制定策略、確定戰略等等,但是這些在我看來并不是交互設計師需要關心的事情(除了優化產品)。

          怎么做競品分析

          大家在網上能看到很多競品分析文檔,會發現里面的內容非常多,而且很多都看不懂。告訴你三個字:不用看。
          這些文檔看起來好像很專業,但是當中涉及的數據內容、商業分析、產品戰略等大部分都是筆者自己 YY 的,這個不僅對做競品分析沒什么幫助,還會使自己在做的過程中特別容易跑偏。所以你只需要關注以下六個點來做或看競品分析文檔。
          1. 找到商業需求
          2. 用戶操作流程
          3. 產品功能分析
          4. 交互邏輯思考
          5. 用戶使用評價
          6. 得到設計需求

          01. 找到商業需求

          商業需求這個點,不僅僅適用在競品分析的開頭,我們做交互文檔、需求文檔都要把商業需求放在首位。只有商業需求的目標明確了,才好進行下一步操作。那什么是商業需求呢?
          給大家舉個簡單的例子:
          今天接到一個產品需求:即優化產品的搜索功能??赡芎芏嗳丝吹竭@個需求就馬上開始看看別人的搜索都是怎么做的,然后抄一下,改一下就好了。這樣設計出來的東西,只能說是一個具體的設計任務,而不是解決實際問題的方法。
          我們要先找到商業需求,為什么要優化產品的搜索功能呢?有些資深的產品經理會在需求文檔中寫出,而有的并不能想到這一層,僅僅只是覺得不好用所以讓你去優化。所以當你的產品經理屬于后者的時候,你就要提前參與到前期的工作中,給自己提問題,告訴自己為什么要去優化,以及它能帶來什么效益?
          當你的工作做到位的時候,并且了解的足夠多的話,你很輕易的就會發現,我優化這個搜索功能的原因有兩個,也就是商業需求:一是提升平臺成交率,二是獲取用戶數據。

          02. 用戶操作流程

          得到商業需求,我們就要做具體操作,就是找到合適的競品。這里我擴展一個話題,就是找什么競品。
          通常,我把競品分為三大類,分別是核心競品、潛在競品(類競品)、交互參考競品,這三類具體指的是什么,有興趣的小伙伴可以自己去研究了解。
          找到這三類競品后,要做的就是把它們所有關于搜索功能模塊的界面做一個仔細操作,并截圖單獨存放在一個文件夾中做深入分析。
          比如這個功能涉及到的頁面、動效、視覺等所有信息都進行詳細觀察,然后將其做成一份流程圖,將所有的競品都這樣做完后,進行對比分析,你就會發現當中的差異,然后就可以知道哪種操作路徑是最好或最適合你的產品的。

          這圖是我為了寫文隨便搭的,就是個demo,具體的大家還是要自己去操作。

          03. 產品功能分析

          當你列出所有流程操作圖后,下面就可以對搜索的功能進行分析。
          這塊操作起來比較簡單,首先建一張表,羅列出相應的支持功能,然后對支持的競品類目打上勾,不支持的就不做處理,如下圖:

          這圖也是我為了寫文隨便搭的,就是個demo,具體的大家還是要自己去操作。
          做完以上操作,接下來再分析每個競品的搜索導航是屬于什么類型,這種類型對搜索有什么好處等等。包括搜索功能模塊的其他信息,如展示形式、關鍵詞、篩選字段等等,以此推導出其中的差異。當然,做其他功能也是一樣,我只是拿搜索做個例子。

          04. 交互邏輯思考

          由這層開始,要分析功能交互的問題。在每個流程圖的邊上寫下相關的交互邏輯,然后通過自身的行業知識來拆解競品當中的交互信息,如:
          • 搜索之后頁面的跳轉的層級
          • 搜索結果展示
          • 頁面布局的合理性
          • 圖片比例規則
          • 按鈕熱區
          • 表單展示形式
          • 等等
          如果你是一個資深的交互設計師,看到的信息還會更多,這塊跟自身能力有關,拆解的產品、分析的交互邏輯越多,這塊的梳理能力就會越強,看產品的本質也會越深。那么你分析競品所能得到的信息也是一般交互和產品不能發掘的。(關于這塊的產品拆解我后續會有文章單獨說明)

          05. 用戶使用評價

          這塊工作看著好像跟競品分析不搭邊,但卻是不可缺少的一環。因為即使你做了再多的分析和拆解,看了再多的偏好數據(更何況有些公司拿到的數據并不全面),都沒有看用戶使用評價來的更加直觀。所以看用戶的使用評價變得極其重要,只有真實了解用戶內心,你才能真正設計出好的產品。
          我們可以通過各個渠道去了解用戶對一款產品的評價,包括對某個功能的看法,當然我之前也說過,我們不能聽用戶的一面之詞,所以需要去提煉當中的關鍵信息,幫助自己更好的去完善產品。
          這塊其實沒什么好說的,在競品分析文檔中,這塊內容其實不需要做過多的展示,只要拿到你的關鍵信息并做個大概說明,然后說出你從中得到的設計思路就可以了,我們最后還是要看輸出總結,即通過做競品分析得到的設計需求。

          06. 總結輸出

          當我們按照上面的流程做完所有步驟之后,你就會得到你的設計需求,如:
          • 關鍵詞搜索
          • 搜索建議
          • 條件過濾
          • 搜索歷史
          • 查找相似商品
          • 讓用戶快速識別搜索入口
          • 字段排序
          等等。
          這些所有子功能都是通過做競品分析得到的,當然你也可以通過用戶調研等方式去得到設計需求。
          說這么多,就是告訴他家我們做一個產品時,不是自己去YY要做什么,而是通過這一系列工作流去找到應該做的事情。這就是你在這個崗位必須做到的事情,不要以為產品或交互的工作很簡單,上面的每個步驟都是需要大量時間的練習才能做好的。

          小結

          我們通過競品分析來提高我們產品自身的核心競爭力,并不是為了求同,也不是為了模仿,而是為了突出自身的產品價值,正所謂知己知彼,百戰不殆,競品分析的目的并不是為了抄襲,而是為了超越競品。
          不過,競品分析還是會有一定的局限性,比如說我們做競品分析的時候往往容易將產品和企業文化、產品商業戰略等信息剝離開來,但是對于很多產品來說,這些是很重要的東西。所以也就很容易忽視這其中的相關性,分析的時候就有可能導致片面或者出現誤差。
          所以我們就要不斷地改進我們的競品分析報告,學會從整體上去把握產品的脈絡,才能更好地擺脫競品分析的局限性。 

          四大分析法打造你的產品說服力

          資深UI設計者

          開篇明義,這四大分析法就是:市場分析、競品分析、用戶分析、需求分析。從這四個角度深入分析,就能證明你產品方案的正確性。
          其實干了多年的產品老手,一眼就能看出我說的都是「廢話」,誰都知道這四類分析法是做產品的基本功,做好了當然能把產品做好。是的,我寫這篇文章還有一個目的:就是讓大家重新重視這些「基本功」,心態歸零。
          很多時候,產品經理都被各業務方需求壓得喘不過氣,更多時間在寫文檔、畫原型、跟項目、處理 bug 反饋中度過。各位正在看本文的產品經理可以回憶下,有多久沒認真做過分析了?

          話說回來,所謂「認真分析」,也是有法可依、有據可循的。今天就給大家復盤下,身為產品經理,最需要掌握的四大分析法,都如何來做。 

          一、市場分析

          市場分析的官方定義:
          對市場容量、市場規模及市場特性等相關內容進行實事求是的經濟分析及預測 。
          包括三大范疇:
          • 從行業角度,要看行業有沒有發展,市場規模大不大,政策好不好;
          • 從用戶角度,要看市場中的用戶習慣、用戶構成、用戶期望;
          • 從自身角度,要認清在市場中自己的優勢劣勢,遇到的挑戰等。
          如果要用一句話描述做市場分析的目的,就是看你要做的這個產品,能不能賺錢。是的,雖然很殘酷,但一款不賺錢的產品,無論用戶體驗多好,設計多精美,技術多先進,仍舊是無法持續的。
          當然,除了能不能掙錢外,還要進一步研究為什么能掙錢,怎么掙錢,怎么掙到更多錢,能掙多少錢等等。
          具體的分析方法,包括:
          • 搜集相關資料,包括宏觀經濟、行業競爭、技術趨勢、市場階段、市場規模等;
          • 分析市場用戶基本情況;
          • 分析自身基本情況。
          可能會用到的一些分析模型包括:PEST、SWOT、波特五力等等,這里不再展開,大家可以按關鍵詞搜索更多。

          二、競品分析

          競品分析和市場分析是相輔相成的,有市場就有競爭,很少有一家獨大的情況,因此就需要你思考如何在激烈的競爭中脫穎而出。
          競品分析的目的:一方面是了解市場格局,判斷是否有機會切入;另一方面是為了制定有利于自身的競爭策略。這個策略,不僅體現在交互設計、使用流程、用戶體驗上,還要考慮運營、營銷、推廣策略,甚至還有資本運作方式等。
          因此,要求你做競品分析時,要先定義清楚你分析的目的是什么,然后自頂向下地進行,從行業格局到功能細節,都要有所涉獵。

          三、用戶分析

          用戶分析的目的是為產品的立項或優化提供定量或定性支持 ,常見方法包括:觀察用戶行為、聽取用戶意見、收集用戶數據。對于新產品,比較好用的分析方法是做用戶調研。
          在用戶調研過程中,最需要注意的就是調查問卷的撰寫,總結下我覺得需要注意的幾點:
          • 避免出現誘導用戶選擇的選項,比如:如果給你提供一個XX功能,你會不會用。
          • 避免出現無法理解的專業術語,比如:你是否希望我們的產品采用個性化推薦算法分發內容。
          • 避免出現容易引起歧義的模糊詞語,比如:你使用社交電商產品頻率是多少。
          • 避免出現需要讓用戶思考的問題,比如:你每周共花多少錢買我們的產品。
          • 避免直接出現產品名稱,比如:你覺得像喜馬拉雅、得到這樣的知識付費產品能解決你的問題么。
          還有一點想說的是:設計每道題的每個回答項時,都要明確每個選項你希望帶來的結論是什么,這樣才會促使你不斷完善自己的問卷。 

          四、需求分析

          需求分析是我覺得四大分析里最難的,也是產品經理的必備課題,因為這背后體現的是對心理的洞察,而「人心」其實是最難猜的,抓住了人心,你的產品自然會成功。
          需求分析的過程,要求產品經理具備一雙敏銳的眼睛發現需求,一顆好奇心挖掘需求。日常工作中,你所面對的需求包括:客觀需求和主觀需求。
          客觀需求:是指通過行為數據、市場趨勢分析、競品調研、用戶研究、體驗問題等渠道收集的需求,通常要求產品經理時刻保持對行業、對數據的觀察和思考。
          主觀需求:是明確有人向產品經理提出的需求,你的需求方可能包括老板、客戶、用戶、內部團隊。日常工作中最復雜的情況也就是處理主觀需求,因為「說服」是個非常耗時耗力的過程,但也是體現你產品能力的時候。
          具體如何分析需求,其實已很多方法論,比如威格斯法、KANO模型、Y模型、四象限法等。
          建議在每次分析需求時,都用如下句式對需求定義:
          什么人,在什么場景下,為了達到什么目的,在遇到什么問題的情況下,希望采用什么方法來解決。
          以上句式,說明了:用戶角色、使用場景、目標定義、任務說明、問題描述。幾乎囊括了描述一個需求的所有要素。
          此外,需求分析最重要的還是如何把用戶需求轉化成產品方案,這一過程要求產品經理同時具備用戶思維和產品思維,具體做法在此不再贅述。
          最后還想再和大家強調下,分析不是目的,最重要的是通過分析得出對工作有幫助的結論 ,與你共勉。

          Java跨域問題的解決方案及axios的跨域請求方法封裝

          seo達人

          如果您想訂閱本博客內容,每天自動發到您的郵箱中, 請點這里

          原因

          出于安全考慮,瀏覽器有一個同源策略。瀏覽器中,異步請求的地址與目標地址的協議、域名和端口號三者與當前有不同,就屬于跨域請求。

          限制跨域訪問是瀏覽器的一個安全策略,因為如果沒有這個策略,那么就有被跨站攻擊的危險。比如,攻擊者在自己的網站A放置一個表單,這個表單發起DELETE請求,刪除某個用戶在B網站上的個人資料。如果沒有同源策略保護,那么在同一個瀏覽器內,如果用戶已經登錄了B網站,這個刪除的請求就會被接受,導致在用戶不知情的情況下自己在B網站中的資料被刪除。

          解決方式

          瀏覽器的同源策略提升了安全性,但是給需要在不同域名下開發的開發者帶來了跨域問題。

          解決跨域的問題主要有: 
          jsonp和cors。jsonp是利用 script 標簽可以跨域加載的特性而創造出來的一種非正式的跨域解決方案。在實際開發中,推薦使用cors,即在服務端返回時加入允許跨域的請求頭,允許指定域名的跨域訪問。

          千萬要小心!這種直接加 * 號的做法是相當危險的,千萬別這么做!

          response.addHeader("Access-Control-Allow-Origin", "*"); 
          
          • 1

          正確的做法:

          1. 創建一個 Filter 類

          /**
           * 使用Filter的方式解決跨域問題
           */ public class CorsFilter implements Filter { private static final List<String> ALLOW_ORIGINS = Config.getListString("allowOrigins", ","); private static final String REQUEST_OPTIONS = "OPTIONS"; @Override public void init(FilterConfig filterConfig) throws ServletException {
              } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                  HttpServletRequest request = (HttpServletRequest) servletRequest;
                  HttpServletResponse response = (HttpServletResponse) servletResponse;
                  String orgHeader = request.getHeader(HttpHeaders.ORIGIN); if (orgHeader != null && ALLOW_ORIGINS.contains(orgHeader)) { // 允許的跨域的域名 response.addHeader("Access-Control-Allow-Origin", orgHeader); // 允許攜帶 cookies 等認證信息 response.addHeader("Access-Control-Allow-Credentials", "true"); // 允許跨域的方法 response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PATCH, PUT, HEAD"); // 允許跨域請求攜帶的請求頭 response.addHeader("Access-Control-Allow-Headers", "Content-Type, Content-Length, Authorization, Accept, X-Requested-With"); // 返回結果可以用于緩存的最長時間,單位是秒。-1表示禁用 response.addHeader("Access-Control-Max-Age", "3600"); // 跨域預檢請求,直接返回 if (REQUEST_OPTIONS.equalsIgnoreCase(request.getMethod())) { return;
                      }
                  }
                  filterChain.doFilter(request, response);
              } @Override public void destroy() {
          
              }
          } 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          • 15
          • 16
          • 17
          • 18
          • 19
          • 20
          • 21
          • 22
          • 23
          • 24
          • 25
          • 26
          • 27
          • 28
          • 29
          • 30
          • 31
          • 32
          • 33
          • 34
          • 35
          • 36
          • 37
          • 38
          • 39

          2. 在 web.xml 的最前面注冊這個 Filter

          <filter> <filter-name>corsfilter</filter-name> <filter-class>com.bj58.crm.plus.filter.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>corsfilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> 
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9

          前端使用 axios 可以先進行封裝

          http-util.js

          let axios = require("axios"); let qs = require("qs");
          axios.defaults.withCredentials = true;
          axios.defaults.headers.post["Content-Type"] = "application/x-www-form-urlencoded"; function post(url, param) { return axios.post(url, qs.stringify(param))
          } function get(url, param) { axios.get(url, {params: param})
          }
          
          export default {
            get,
            post
          };

          藍藍設計www.syprn.cn )是一家專注而深入的界面設計公司,為期望卓越的國內外企業提供卓越的UI界面設計、BS界面設計 、 cs界面設計 、 ipad界面設計 、 包裝設計 、 圖標定制 、 用戶體驗 、交互設計、 網站建設 、平面設計服務




          轉載設計反模式之架構設計

          博博

          背景

           

          下圖所示線上故障,你的產品線是否曾經中招或者正在中招?同樣的問題總是在不同產品線甚至相同產品線不同系統重復上演,這些故障有個共同特點,就是線下常規測試很難發現,即便線上驗證也不易暴露。但是總是在“無變更安全日”悄然爆發,嚴重影響系統穩定性指標。



          面對這些看似并無規律的故障,Case by case的分析無疑是低效而且不系統的,無法全面掃除穩定性測試盲區,也無法阻止悲劇在其他產品線再一次發生。為此筆者把問題聚類,根據問題特點尋求通用測試手段,并在產品線各個系統落地驗證,效果顯著,現把個人經驗融合前輩經驗產出,供大家參考,有則改之,無則加勉。

          首先,為了讓大家更好了解這些故障對業務系統穩定性的影響程度,需了解下何為穩定性,衡量指標就是系統可用性= MTBF / (MTBF + MTTR) , 其中MTBF, Mean Time Between Failure, 是平均無故障時間, 而MTTR, Mean Time To Repair,是平均修復時間,參考下表更加直觀。

          從如上數字看,5個9的故障時間月故障時間只有25s,3個9的可用性月故障時間也只有40多分鐘,回想我們平時處理過的線上問題,開發和測試質量把控不過關,然后再把期望寄托在半人肉處理故障的運維團隊,顯然無法達到線上產品穩定性要求。

          為了保障系統穩定性,提前消除風險勢在必行。產品質量風險類型很多,產品研發流程的各個階段都可能引入和存在風險,每個階段的風險的類型和發現手段都不盡相同,為此產出如下風險模型。按照風險發生的階段及原因,風險類型可分為:架構設計風險、編碼風險、安全風險、流程規范風險、運維風險和監控風險。


          本文主要講解架構設計風險,接下來介紹的每個風險都會說明風險定義,影響,以及通過什么技術手段來進行風險識別,最后總結風險消除方案。另外每個風險都會有具體的例子來講解,這些例子都是發生在百度內部的真實故事。


          架構設計風險


          架構設計風險是QA最容易忽略的,該類風險出現在研發階段的早期,我們都知道缺陷越早的暴露后期研發的維護成本越低,而且一旦架構設計上出現了問題,影響面是涉及整個模塊甚至系統的,修復代價必然非常高,因此對于架構設計的風險更要提前了解和避免。

          根據既往經驗,架構設計風險大概可以分為以下幾個維度:交互、依賴、耦合。

          交互類常見風險:重復交互、高頻交互、冗余/無用交互、接口不可重用、超時重試設置不合理、IP直連、跨機房等。

          依賴類常見風險:不合理強弱依賴、無效依賴、忽略第三方依賴、緩存依賴失效等。

          耦合類常見風險:架構耦合不合理、緩存耦合不合理等。


          一、重復交互

          1、風險定義

          在一次業務請求中,系統內部發起了多次完全相同的網絡交互,即存在重復交互風險。從交互層級和上下游來說,重復交互有兩類,整個業務請求范圍內的重復和同層重復,其中同層重復交互的上下游也是相同的,本文更多關注的是整個業務請求范圍內的重復交互。通常在一次業務請求中,為了提升性能和負載,盡量避免或者降低重復交互次數。

          2、風險影響

          重復交互增加接口耗時,降低接口性能,當重復的是跨機房交互會使得性能急劇下降影響系統穩定性,增加對下游服務的壓力(模塊壓力增加一倍,下游服務壓力增加幾倍)。

          3、風險識別

          如果兩個交互具有完全相同的請求服務對象(尤其是mysql、redis、memcache這類數據存儲服務)、請求數據、返回數據,那么這兩個交互就判定為重復交互;對于獲取不到交互數據時也可以通過數據包size進行初判。這里可以借助開源trace系統,采集業務測試時的調用鏈信息,根據上面的判斷規則進行風險自動識別。

          4、風險消除

          在對實時性要求可控的前提下,將第一次查詢信息緩存下來。


          • 真實案例一:系統間重復交互。11次重復請求session,對于前端一次請求就要對session模塊產生幾十倍的流量沖擊,所有這些交互都是完全重復的,極大的降低的了接口性能和session的負載能力。


          • 真實案例二:mysql/redis重復交互。mysql/redis作為系統中性能瓶頸,這樣的重復請求無疑加速了其性能瓶頸的到達。


          二、高頻交互

          1、風險定義

          一次用戶發起的請求,如果在模塊之間的交互次數完全依賴于后端返回的數據條數,會給下游造成極大壓力的同時,也降低了系統的穩定性。相同業務請求的模塊交互次數多少不一,原因通常是代碼中循環操作內部存在網絡交互,總交互次數受到循環迭代的次數影響。這樣的情況在模塊上線初期,可能因為數據量比較小、pv比較小很容易被人忽視,當某天上線一些大數據、大客戶,將會給予致命一擊。

          2、風險影響

          循環請求次數過多會導致下游壓力倍增(前端pv增加一倍,后端pv增加幾十倍),接口性能不穩定,降低系統處理能力。系統穩定性完全依賴于數據的代碼邏輯非常脆弱,當遇到某一個大數據時將會出現模塊假死、系統雪崩、功能失敗。

          3、風險識別

          基于上游傳來的數據或某個子請求返回的數據量(通常是一個數組),針對每個數組元素進行網絡請求,遍歷并沒有錯,但是要對這個遍歷的數組元素個數有限制,否則循環遍歷的次數就完全依賴于數據。這里也可以借助開源trace系統,采集業務測試時的調用鏈信息,根據上面的判斷規則進行風險自動識別。

          4、風險消除

          數據量要可控,結合產品業務需求,比如請求返回結果要有上限;批量請求替代逐個請求。


          • 真實案例:查詢某商戶物料詳情,當該商戶擁有大量物料,就出現了如下場景,用戶的一次查詢就造成服務與db之間156次交互,那該接口的性能就可想而知了,平均耗時都在3s+,用戶體驗極差。



          三、冗余/無用交互

          1、風險定義

          交互依賴的數據已出現異常,還繼續執行后續交互,使得后續的交互是沒有任何意義的冗余交互。這些依賴的數據,可能是上游傳遞而來,也可能是與下游模塊請求得來。

          2、風險影響

          冗余交互會占用系統資源,降低接口性能,從而影響系統穩定性和性能。

          3、風險識別

          如果交互A依賴數據B(比如交互A的請求數據中需要傳入B),在B異常(比如數據為空、null、false等)情況下,還是發生了交互A,那么就認為A是冗余交互;如果操作A依賴于操作B的成功執行,當B異常時,還是發生了操作A,那么A也認為是冗余交互??梢越柚_源trace系統,采集業務測試時的調用鏈信息,根據上面的判斷規則進行風險自動識別。

          4、風險消除

          代碼中增加異常邏輯判斷:當交互依賴的數據異常時不進行該交互。


          • 真實案例:如下調用鏈正常場景是先查詢團單list,然后用團單list去查詢每個團單的優惠。但是當查詢團單列表為空時,就沒有必要再調用marketing查詢團單的優惠信息了,應該立即返回錯誤碼。這里增加無效交互無疑降低了接口性能。



          四、接口不可重入

          1、風險定義

          相同請求發給模塊再次處理,不能保證結果一致,符合預期。

          2、風險識別

          相同請求,模塊返回結果不一致亦或重復寫操作產生臟數據。這里可以利用錄制工具,重放請求,驗證結果正確性。

          3、風險消除

          對于防重入可總結三點,前端加入防重復點擊設置,接口層加入鎖機制,db層需要加入唯一鍵設置。



          • 真實案例

          在商家會員卡充值購買的流程中,nmq故障情況下,購買結果頁顯示充值失敗,但是卡中余額卻一直在直線增加,原因是充值接口沒有做到可重入,這個case幸好在線下及時發現,否則后果不堪設想。

          商家會員卡涉及到的購買流程如右下圖所示:



          用戶提交訂單并且錢包處理完成后,錢包回調交易模塊的payresult接口,交易模塊驗證通過之后,會調用商家會員卡的rechargemoney接口給商家會員卡充值。為了提高充值接口的可用性,與交易模塊有個約定了一個機制:若調用rechargemoney返回的errno不為0 ,則投入nmq重試三分鐘,三分鐘之內的重試均沒有成功,才觸發自動退款。商家會員卡模塊的充值接口rechargemoney的流程圖如下圖所示:



          在rechargemoney接口處理過程中,有一個防頻繁重入的判定redis鎖過程,expireTime設置時間為10s,10s內會攔截過來的重復請求,直接返回。

          上述過程可以看到,前端是有無限重試策略的,因此可以認為前端無防重入,那么看接口層鎖機制,重試時間3min明顯大于鎖有效時間10s,因此相同請求10s后鎖機制也失效,再看db層,插入order_id和其他營銷信息,數據庫中并沒有設置order_id為唯一鍵,因此該接口徹底失守,沒有做到可重入,相同訂單可以重復插入成功,從而導致業務表現為同一訂單多次重復充值。

          對于該案例,改進方案是首先將鎖有效時間設置大于一切來源的重試時間,其次在db充值記錄表中將orderid設置為主鍵,雙重保護該接口做到可重入。


          五、超時設置不合理

          1、風險定義

          顧名思義,就是超時并沒有根據系統真實表現科學的設置。

          2、風險影響

          就像下圖化學反應一樣,不合理的超時實際設置并不會產生真正影響,但是遇到網絡故障,依賴超時時,后果不堪設想。



          模塊交互必設超時,這是基本要求,但是超時設置過長、過短可能會適得其反。不合理超時設置主要表現為①交互超時時間設置過長,比如5s甚至10s的超時②下游超時時間大于上游超時時間。

          交互超時重試時間過長,在下游偶爾出現網絡抖動時連接被hang住,接口耗時增加,并且降級模塊處理能力。下游超時>上游超時,上游超時后斷開連接引發重試,下游還在繼續上次運算(此時已經沒有意義),下游負載增加N倍(取決于重試次數設置和發生重試的層數),使得系統性能急劇下降甚至雪崩。

          3、風險識別

          ①超時時間設置過長(比如數據庫connect超時1s,模塊讀寫超時5s)

          ②下游超時時間大于上游超時時間。

          4、風險消除

          從系統整體考慮,并且結合重試和本模塊計算時間的影響。下游超時<上游超時;超時時間不宜過長,根據下游接口性能設置;對于弱依賴的服務交互,超時時間更不能過長,以免弱依賴阻塞主流程。


          • 真實案例:如下圖,該接口調用redis超時時間超過2s,然而Redis性能極好,單線程阻塞性server,這種長耗時會阻塞其他請求,很容易引起系統雪崩,應該把redis連接超時時間修改適當小。



          六、重置不合理

          1、風險定義

          顧名思義,就是重試并沒有根據系統真實表現科學的設置。

          2、風險影響

          任何網絡交互都可能失敗,為了保證最終交互成功,通常交互失敗/超時、數據錯誤后再次與該模塊交互,即發生了重試。重試的次數設置不當,輕者交互成功率不達標,業務失敗率增高,嚴重者引發系統雪崩。

          3、風險識別

          查看框架配置文件中重試次數配置,是否簡單粗暴的經驗值設定重試次數,比如一律重試3次,查看代碼中邏輯控制的重試限制(這種很隱蔽)。

          4、風險消除

          相對于固定的重試序列,隨機重試序列也可能給系統帶來風險,例如可能會降低下游模塊的cache命中率,降低系統性能,甚至引起雪崩。

          評估重試機制:

          1) 真的需要在每一層都努力重試嗎?

          2) 真的需要這么多次重試嗎?

          3) 真的需要在連接,寫,讀這三者失敗后都重試嗎?

          • 按照業務需求和模塊性能設置重試次數

          • 弱依賴不用重試也可以

          • 下游模塊性能好,基本不會超時,也可以不重試

          • 大部分情況下,重試次數為1已經足夠


          • 真實案例

          如圖為某產品線的架構,整個系統中,上游模塊對下游模塊所有的交互,重試次數都是設成3次,交互失敗包括連接失敗,寫失敗,讀失敗這三種情形。如果是寫和讀失敗,那么要關閉當前連接,再重新發起連接。



          如果一臺bs假死,到該bs的請求會超時。(注意區分模塊假死和真死,假死情況下,模塊端口打開,能夠接收上游連接,但是由于各種原因(如連接隊列滿,工作線程耗盡,陷入死循環等),不會返回任何應答,上游模塊必須等待超時才知道失敗,連接超時,寫超時和讀超時都有可能。而在真死情況下,模塊端口關閉,或者干脆程序退出,上游模塊連接它會很快得到失敗返回碼,這個返回碼由下游模塊的操作系統協議棧返回的,如ECONNREFUSED錯誤碼代表端口不存在,連接被拒絕。) 

          那么as有1/3的概率需要重試,as重試的過程中,ui可能早就認為as已經超時了,所以ui也開始重試,ui重試的過程中,webserver可能認為ui已經超時了,所以webserver也開始重試……就這樣,整個系統的負載急劇增加,到達bs的qps會是平時的27倍,直到系統崩潰為止。


          七、IP直連服務方式

          1、風險定義

          A,B兩個系統交互,B系統分布式部署,A-B連接是通過配置B系統所有IP方式。

          2、風險影響

          當B系統分布式服務中某一臺掛掉時,不能做到failover,導致故障影響擴大。

          3、風險消除

          通過bns或者組的方式進行連接。


          • 真實案例

          某產品線依賴服務redis調用均采用ip列表的方式,如果redis proxy出現單機故障,需要人工介入進行切流量止損。單機發單重啟修復周期有時會達小時級別,因此線上服務在故障期間會長時間處于切流量狀態,高峰期單機房容量會存在風險。如同時有其他機房服務異常,則無法執行既定預案止損。并且如想下掉故障proxy,只能采用發上線單修改線上配置的方式。止損操作復雜,周期長,效率低下,具體case如下:

          (1)用戶中心redisproxy單機故障,人工切流量止損,恢復服務花費2小時,期間線上處于切流量狀態。

          (2)商品中心redis proxy單機故障,會存在扣除庫存失敗的風險。恢復服務花費半小時,后續又再次發生宕機,發單下掉故障proxy。

          如上對應前面講的故障時間,該服務sla月可用性已不足3個9。


          八、跨機房請求

          1、風險定義

          交互的兩個模塊分別部署在不同機房。

          2、風險影響

          跨機房交互由于存在網絡延時,嚴重影響接口性能、請求成功率,極大的降低了系統穩定性。

          3、風險識別

          ①配置錯誤(ODP框架)ral-service中配置的服務后端IP的Tag不能為空(在ral中,會將Tag為空的也認為是本機房)②上游傳入idc錯誤,Idc是完全匹配,nj和nj02就不相同,因此如果上游傳入nj02,當前模塊的idc是nj,就會找不到對應的Tag而只能使用default。

          4、風險消除

          主要關注配置是否合理,由于線上配置很難在線下驗證正確性,肉眼排查難免遺漏,因此可通過線上機房流量切換演練驗證。


          九、不合理強/弱依賴

          1、風險定義

          所謂強依賴就是,請求鏈路中某個服務失敗/結果異常/無結果后,核心邏輯必失敗,否則就認為是弱依賴。不合理的強弱依賴有兩類,本應該是弱依賴的設置為強依賴,本應該是強依賴的設置為弱依賴。

          2、風險影響

          系統穩定性取決于調用鏈中所有依賴穩定性最差的依賴,如果將穩定性較差的服務作為強依賴將嚴重影響穩定性

          3、風險識別

          強弱依賴的合理性是需要結合業務判斷的,如果業務返回結果不可或缺該依賴,那么就該設置強依賴;如何判斷該依賴是否為強依賴可以通過故障模擬驗證,如果模擬該依賴異常時導致調用異常,則判斷其為強依賴。

          4、風險消除

          ①調整不合理的強弱依賴關系,將業務非強依賴服務降級;②通過系統優化及運維優化等手段提高強依賴的穩定性。③對強依賴結果進行全面校驗,保證強依賴故障能夠及時被發現。


          • 真實案例

          用戶下單請求到trade模塊,是通過消息隊列nmq保證下單后的商戶通知功能,通知商戶是借助公共服務云推送,這里云推送被實現成了強依賴,也就是當云推送如果失敗,返回給本次請求失敗。

          某次下單高峰期時,云推送出現故障,無法給ios用戶推送消息,nmq收到請求失敗后,會持續不斷的重發,nmq的通道堵塞之后也影響了trade模塊向nmq的請求故障不斷往上層蔓延,最后用戶無法下單。



          對于如上案例,工程師最后去掉對云推送強依賴代碼,服務才慢慢恢復,但已造成非常大的損失。


          十、無效依賴干擾

          1、風險定義

          服務啟動流程中與該依賴建立了連接,但是整個邏輯處理過程中無需依賴該服務,無任何業務關聯性。

          2、風險影響

          其實該風險是不合理依賴的一個特例,無業務關聯性的依賴應該及時去除,否則會影響整體服務穩定性。

          3、風險識別

          與依賴服務只有一次鏈接交互,無其他交互,就可以初步判斷該依賴為無效依賴,為了準確評估可再結合代碼排查。


          • 真實案例

          某產品線由于配置管理較亂,有個服務每次啟動都會判斷多個與業務完全不依賴的服務啟動情況,這幾個依賴服務處于無人維護狀態,非常不穩定,從而導致該服務啟動失敗率非常高。


          十一、第三方依賴

          1、風險定義

          請求的完成,需要依賴產品外的其他服務,都稱之為第三方(tp)依賴,按照公司又分為公司外第三方,比如糯米酒店依賴攜程服務;公司內第三方,比如passport相對于手百。

          2、風險影響

          第三方服務的性能,正確性,穩定性直接影響自身服務,尤其是第三方強依賴,當第三方依賴出現異常,很可能導致自身產品受到損失;公司外第三方依賴有些是小型公司,技術和運維能力有限,其服務的性能,正確性、穩定性不是很高。

          3、風險識別

          第三方依賴的可靠性是不可控的也是我們系統建設中不可避免的,那么只能盡量降低第三方依賴不穩定對自身的影響。

          4、風險消除:

          • 盡量避免第三方強依賴;

          • 超時設置,重試設置結合第三方容量,平均響應時間,部署情況;

          • 增加第三方依賴掛掉,假死,接口變更的校驗及容錯降級處理,從架構和云微商做到各個TP方與自身業務的解耦;

          • 運維上,提高第三方依賴可靠性,使用內網bns,vip請求,且避免跨機房交互。


          • 真實案例

          某產品線依賴A,B,C三個tp方數據進行匯總展示,每次都需要調用三方都有結果時再進行聚合,否則認為整個流程失敗,而三個tp方穩定性不盡相同,其中B是個小公司,經常出現故障,導致自身服務經常故障。

          對此工程師對各個TP方加上了全面校驗,當驗證故障后自動調用降級操作,去掉該tp依賴。從此服務穩定性大大提升。


          十二、緩存穿透

          1、風險定義

          前端請求一個肯定不存在的key,導致每次請求都會請求后端原始數據,使得緩存被“穿透”,當該類請求高并發時,那么后端壓力凸顯。

          2、風險影響

          緩存穿透后,每個請求都會到達后端服務,對后端服務壓力突增;當緩存穿透的并發較高(尤其是惡意攻擊),后端服務很可能被壓垮,導致整個系統癱瘓。

          3、風險原因

          一種可能是對于主從分離系統,緩存失效時間小于主從延遲時間,尤其是跨機房的主從分離,主從延遲在某些時候會達到數秒甚至數十秒,這是如果緩存時間設置過小,就會導致所有緩存讀寫記過均為失效結果,進而請求后端服務獲取新的數據。另一種可能是查詢結果為空的情況。

          4、風險消除

          • 對于查詢結果為空的情況也進行緩存,緩存時間設置短一點,或者該key對應的數據insert了之后清理緩存;

          • 對于一定不存在的key進行過濾,把這些key放到一個大的bitmap上;

          • 設計的時候考慮,當緩存失效時,系統服務的情況及應對措施。


          十三、緩存失效/緩存雪崩

          1、風險定義

          大量緩存同時過期失效,前端請求同時到達后端服務。

          2、風險影響

          當并發量足夠大(比如秒殺,搶購),后端服務很可能被壓垮,導致整個系統雪崩。

          3、風險識別

          緩存設置時間相同,失效周期也相同,導致多個緩存同時失效。

          4、風險消除

          • 不同的key,設置不同的過期時間,讓緩存失效的時間點盡量散列均勻;

          • 在緩存試下后,通過加鎖或者隊列來控制讀數據庫讀寫緩存的線程數量(比如對某個key只允許一個線程查詢和寫緩存,其他線程等待);

          • 做二級緩存,A為原始緩存,A2位拷貝緩存,A1失效時,可以訪問A2,A1緩存失效設置為較短,A2設置為長期。


          • 真實案例

          某產品線監控發現機器A機器的8688端口掛掉了,經追查發現一個廣告配置下發的接口(/api/v1/ipid)掛掉了,據統計,前一天23點到當日9點之間,該接口被訪問了400+次,正常來講,這種廣告配置下發的接口一天最多幾百個請求量。

          經查,客戶端有一個零點定時觸發策略,零點會同時啟動很多服務,平時并發請求會命中緩存,不會造成太大壓力,可是當時正趕上緩存時間到期,大量請求將服務接口壓死,端口掛掉。

          對此臨時方案是在接入層nginx配置文件中加入了流量控制機制,用lua腳本來將零點的請求屏蔽掉,長期方案是避免這種緩存集體失效的情況。


          十四、 架構耦合不合理

          1、風險定義

          系統架構和設計上存在著耦合,包括模塊耦合、接口耦合、消息隊列耦合。具體體現在,主次不分的功能在一個模塊或者接口中實現,nmq中不同重要性的命令耦合在同一個module中。

          2、風險影響

          整個系統穩定性<最不穩定的功能穩定性,不重要的功能可能拖垮重要功能

          3、風險消除

          整體思路就是,重要與不重要拆分,實時與非實時拆分,在線與離線拆分,根本上解決就是架構解耦,但是系統發展到一定階段再拆分代碼成本很高,這里可以通過運維方法控制解耦,具體見如下案例。


          • 真實案例

          某產品線的一級服務和二級服務共同依賴一個基礎服務,由于二級服務的一個bug拖垮基礎服務,從而導致一級服務不可用,對此解決方案是通過運維將不同上游流量分開。



          十五、緩存耦合不合理

          思想同2.1.14這里不再贅述。


          總結


          本文給出了常見的15種架構設計風險,希望大家能夠在實際工作中參考審視自己系統是否也存在同樣的風險,盡早消除,提高穩定性!



          轉載各大團隊校招筆試題集錦

          博博

          UCDCHINA上海群友們這兩年收集整理的校招面試題,包含目前國內幾家頂尖互聯網企業。適用于產品及設計崗的各位小伙伴參考學習。如果有任何想法,也歡迎在群里踴躍發言。反正說的不好也不罰錢╮(╯▽╰)╭


          阿里的面試題

           


          請系好安全帶,有一大波阿里面試題正在向你涌來。。。



          報告,我感覺我和阿里的面試題八字不合,可以看看其他公司的面試題嗎?

          騰訊的面試題


          其他公司的面試題


           


          是不是感覺很難?是不是感覺無從下手?多多參與群內討論,眾多大佬給你指點迷津!




           


          好了~最后的壓軸面試題來了,大家可以踴躍發表感想。答出來的可以找大佬要棒棒糖當獎勵



          如何成為前端開發高手?

          周周

                web前端開發工程是是一個很新的職業,在國內乃至國際上真正開始受到重視的時間不超過五年。web前端開發,是從網頁制作演變而來的,名稱上有很明顯的時代特征。隨著人們對用戶體驗的要求越來越高,前端開發的技術難度越來越大,web前端開發工程師這一職業終于從設計和制作不分的局面中獨立出來。

                 早期的前端其實就是table布局,后來發展到所謂的div+css網站重構,再到現在的讓人眼花繚亂的各種各樣的新技術,web前端技術發展是非??焖俚模虼诉x擇了前端這個行業就意味著不停的學習吧。讓我們先看看張克軍繪制的前端知識體系結構:

                前端開發的核心是HTML+CSS+JavaScript。本質上他們構成了一個MVC框架,即HTML作為信息模型(Model),css控制樣式(View),JavaScript負責調度數據和實現某種展現邏輯(Controller)。

                HTML

                1.標簽的分類,

                2.標簽表示一個元素

                3.按性質分類:block-level 和 inline-level

                4.按語義分類:

                      Headings:h1,h2,h3,h4,h5,h6

                      paragraphs:p

                      Text formatting:em,strong,sub,del,ins,small

                      Lists:ul,li,ol,dl,dt,dd

                      Tables:table,thead,tbody,tr,th,td

                      Forms and input: form,input,select,textarea

                      Others:div,span,a,img,<!---->

                      HTML5:header,footer,article,section

                 XHTML

                 XHTML于2000年的1月26日成為W3C標準。W3C將XHTML定義為的HTML版本,XHTML將逐漸取代HTML。XHTML是通過把HTML和XML各自的長處加以結合形成的。XHTML語法規則如下:

                屬性名和標簽名稱必須小寫

                屬性值必須加引號

                屬性不能簡寫

                用ID屬性代替name屬性

                XHTML元素必須被正確地嵌套

                XHTML元素必須被關閉

               標簽語義化

               為表達語義而標記文檔,而不是為了樣式,結構良好的文檔可以向瀏覽器傳達盡可能多的語義,不論是瀏覽器位于掌上電腦還是時髦的桌面圖形瀏覽器。結構良好的文檔都能向用戶傳達可視化的語義即使是在老的瀏覽器,或是在被用戶關閉了CSS的現代瀏覽器中。同時結構良好的HTML代碼也有助于搜索引擎索引你的網站。

                不要使用table布局,table是用來表格顯示的。

                不要到處濫用div標簽,div是用來分塊用的。

                不要使用樣式標簽,如font,center,big,small,b,i,樣式可以用CSS來控制,b和i可以用strong和em來代替。

                不要使用換行標簽<br />和空格來控制樣式,請用CSS。

                盡量不要使用內聯CSS

                CSS

                1.css基礎知識

                  層疊和繼承

                  優先級

                  盒模型

                  定位

                  浮動

               2.css進階

                  css sprite

                  瀏覽器兼容性

                  IE haslayout和block format content

                  css frameworks 

                  css3

                  css性能優化

                  less and sass

                  css sprite主要用于前端性能優化的一種技術,原理是通過多張背景圖合成在一張圖片上從而減少http請求,加快載入速度。

                  瀏覽器兼容性

                  絕大部分情況下,我們需要考慮瀏覽器的兼容性,目前正在使用的瀏覽器版本非常多,IE6,IE7,IE8,IE9,IE10,Chrome,Firefox,Safari。

                  IE haslayout和block format content

                  IE haslayout是一個Internet explore for Windows的私有概念,他決定了一個元素如何顯示以及約束其包含的內容、如何與其他元素交互和建立聯系、如何響應和傳遞應用程序事件、用戶事件等。而有些HTML元素則默認就有layout。目前只有IE6和IE7有這個概念。BFC是W3C css2.1規范中的一個概念,他決定了元素如何應對其內容進行定位。以及與其他元素的關系和相互作用。這個其實和瀏覽器的兼容性有關,因為決大部分的兼容性問題都是他們引起的。參考:css BFC和IE haslayout介紹。

                  css framework

                  css框架是一系列css文件的集合體,包含了基本的元素重置,頁面排版、網格布局、表單樣式,通用規則等代碼塊,用于簡化web前端開發的工作,提高工作效率。目前常見框架有:

                 960 grid system

                 blueprint css

                 bluetrip

                 minimum page

                 還是一個比較出名的和特殊的框架是Twitter的bootstrap,bootstrap是快速開發web應用程序前端的工具包。它是一個css和HTML的集合,它使用了的瀏覽器技術,給你的web開發提供了時尚的版式,表單,buttons,表格,網格系統等等。它是基于less開發的,不支持IE6,在IE7和IE8里效果也不咋地。

                 css3

                 雖然css3還沒有正式成為標準,但是IE9+,Chrome,Firefox等現代瀏覽器都支持css3。css3提供了好多以前需要用JavaScript和切圖才能搞定的功能,目前主要功能更有:圓角、多背景、@font-face、動畫與漸變、漸變色、box陰影、RGBa-加入透明色、文字陰影。

                 css性能優化

                 css代碼是控制頁面顯示樣式與效果的最直接“工具”  ,但是在性能調優時他們通常會被web開發工程師所忽略,而事實上不規范的css會對頁面渲染的效率有嚴重影響,尤其是對于結構復雜的web2.0頁面,這種影響更是不可磨滅的。所以,寫出規范的、高性能的css代碼會極大地提高應用程序的效率。

                 less and sass

                 less和sass都是css預處理器,用來為css增加一些編輯的特性,無需考慮瀏覽器的兼容問題,例如你可以在css中使用變量、簡單的程序邏輯、函數等等在編程語言中的一些基本技巧,可以讓你的css更加簡潔。適應性更強,代碼更直觀等諸多好處。

                  sass基于ruby開發,less既可以在客戶端運行,也可以借助node.js或者rhino在服務器端運行。

              

          UI設計師如何提升自己?

          藍藍設計的小編

          UI設計師提升自己沒有捷徑,就是多練。聯系當然也要分階段和方法。且在練習前的審美也很重要。下面先說說練習的幾個階段。

          日歷

          鏈接

          個人資料

          藍藍設計的小編 http://www.syprn.cn

          存檔

          亚洲va欧美va天堂v国产综合