發表文章

目前顯示的是 8月, 2024的文章

[C#] 節流策略 - Debounce & Throttle

圖片
    最近有一個案子類似搶票功能,雖然公司流量跟台鐵相比真的不足為奇,但因同事們撰寫程式都會發生超賣或太慢的狀況,導致主管總覺得這個很複雜。 當然超賣的根本原因跟節流沒有太大的關係,這部分有機會再紀錄。 主要是設計架構上可以透過節流策略,加強系統的承載能力,所以實作該策略了。 Debounce(去抖動) ● 作用:在事件頻繁觸發時,只在最後一次事件觸發後的一段時間內執行。 ● 特點:若在等待時間內再次觸發,計時器重置,直到最後一次觸發後才執行。 ● 應用場景:表單輸入自動保存、搜尋框輸入後延遲查詢、網路請求。 Throttle(節流) ● 作用:在固定的時間間隔內限制事件的觸發次數。 ● 特點:保證在特定時間段內最多執行一次,即使事件頻繁觸發。 ● 應用場景:滾動監聽、按鈕防連點、視窗調整大小事件、網路請求。 Trailing Throttle(結合去抖動和節流) ● 作用:在固定的時間間隔內限制事件的觸發次數,並 確保執行最後一次 事件 。 ● 特點:保證在特定時間段內最多執行一次,即使事件頻繁觸發,且會 執行最後一次事件 。 ● 應用場景: 節流情境下,但需要執行最後一次 事件 。 這邊也附上一個js的應用場景( throttle vs debounce ),比起rxjs的圖,這應該是最好理解的方式了,大家可以觀察一下兩者的區別。 Debounce(去抖動) using System; using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; public static class Debouncer { static ConcurrentDictionary _tokens = new ConcurrentDictionary (); public static void Debounce(string uniqueKey, Action action, int millisecondsDelay) { // 如果已經存在 uniqueKey 的 ...

[Testing] 壓力測試 load testing - locust

圖片
    簡單紀錄一個壓力測試工具 - Locust,Locust 是一個開源的壓力測試工具,用於模擬大規模並發用戶請求來測試 Web 應用和 API 的性能。它使用 Python 腳本定義測試行為,支持分佈式測試,並提供簡潔的 Web 界面來監控測試結果,適合進行靈活且可擴展的性能測試。 Locust 特點: 1. 使用簡單:基於 Python 腳本,靈活且易於編寫自定義測試場景。 2. 實時監控:提供友好的 Web UI,實時查看測試結果和性能數據。 3. 可擴展性強:支持分佈式測試,能夠模擬大量並發用戶。 情境: 1 . 目的為搶票。 2 . 組合兩個API測試,一個是取票(book_event),一個是取得當前票數名額資料(search_event)。 3 . 提供一組使用者資料,做為壓力測試資料。 4 . 每次隨機取一個使用者發起請求。 提前補充: 1. Locust有很多進階的應用,目前只記錄最基本的功能。

[SQL] Oracle查無資料 (因 SESSION, NLS, AMERICA...因素)

圖片
    如題,近期公司導入 Oracle,導致程式碼需要調整,卻遇到當前環境查無資料! 但窗口卻說權限有開了,所以紀錄下解決問題的方式。 ● 情境: 1. 窗口提供同義詞(Synonyms) 2. 因公司別不同,窗口也提供一個方法切換公司別,假設為 SET_COMPANYID_CONTEXT ● 解決思路: 1. 先詢問窗口他們使用了哪些NLS_PARAMETERS,通常會變的是 NLS_LANGUAGE,因為中文版更新頻率低,所以常使用美國版。 2. 再來就是更新當前環境的NLS_PARAMETERS,確認看看有無資料。 3. 最後就是在程式中提前設定好NLS_PARAMETERS。 Step1: 查看當前環境的 NLS_PARAMETERS -- 查詢出當前環境的 NLS_PARAMETERS SELECT * FROM V$NLS_PARAMETERS; -- 查詢出可使用的 VLS VALUE SELECT * FROM V$NLS_VALID_VALUES Step2: 當前環境執行語法,確認是否有資料 ALTER SESSION SET NLS_LANGUAGE='AMERICAN' Step3: 程式提前設定  NLS_PARAMETERS 重點是要在每個 connection 連接後,提前設定即可。 //... using (var sessionCommand = connection.CreateCommand()) { // 修改 NLS_LANGUAGE sessionCommand.CommandText = "ALTER SESSION SET NLS_LANGUAGE='AMERICAN'"; sessionCommand.ExecuteNonQuery(); // 修改 NLS_DATE_LANGUAGE (假設比對結果有差異就要加上) sessionCommand.CommandText = "ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN'"; sessionCommand.ExecuteNo...