在 DEV,我們對開源開發的承諾推動了我們的決策過程,特別是在我們使用的工具和技術方面。我們的平台(我們以Forem 的形式開源)體現了這種精神。 Forem 是一款開源 Rails 應用程式,旨在促進社群和內容共享。作為這種方法的支持,基礎搜尋是在 Postgres 中實現的,以服務小型且簡單的用例。然而,對於服務高流量的全球網路來說,這並不是一種完全足夠的體驗。
延遲是衡量使用者體驗的唯一客觀指標。如果請求載入速度較慢,用戶將離開和/或失去對他們正在存取的功能的信任。我們一直把這個當作重中之重,效能是搜尋的必備條件。
DEV 的核心程式碼庫需要能夠在沒有第三方依賴的情況下進行破解,但我們的生產實例始終依賴這種類型的基礎設施來實現某些功能。我們看到了利用我們信任的工具來增強核心體驗的機會,該工具可以提供我們所需的使用者體驗和規模。
DEV 被稱為輕量級、低延遲的服務,可在全球範圍內使用。我們嚴格由 Postgres 支援的搜尋體驗無法擴展以滿足這些需求。作為僅使用單一資料庫進行讀寫的服務,昂貴的查詢也可能會拖累整個服務。
進入 Algolia,我們將其實施為對核心體驗的逐步增強 - 在性能和體驗方面。我們整合了 Algolia,以利用他們的產品和基礎設施來提升搜尋體驗,同時仍允許應用程式在沒有這種依賴性的情況下在其核心上執行和執行。
Postgres 搜尋功能一直是 Forem 的可靠基礎。它提供了一組強大的功能,非常適合許多應用程式,特別是那些優先考慮開源工具的應用程式。透過 Postgres,開發人員無需額外服務即可啟動 Forem 應用程式。此設定非常適合小型專案或剛起步的專案,可確保易於開發和部署。
隨著 DEV 的普及,對我們基礎設施的需求也隨之增加。我們開始遇到影響使用者體驗的延遲問題。雖然 Postgres 功能強大,但要滿足我們不斷成長的社區所需的規模和速度,就需要一個更快回應的解決方案。這就是 Algolia 發揮作用的地方。
我們希望我們的會員在世界各地都能獲得良好的體驗,而我們的 Postgres 基準並沒有提供我們能夠提供這種體驗的場景。雖然我們喜歡 Postgres 並且絕對認為它是我們體驗的核心,但嘗試完全提供我們想要的體驗是不切實際的。
在基礎設施方面的考慮和不同方法的時間消耗之間,我們為這項任務尋求另一個開源庫也是不切實際的,因為它只能讓我們完成部分任務。我們對未來的模組化感興趣,這是一種選擇,但就我們的用例中達到的最佳工具而言,Algolia 是最有意義的。
Algolia 提供了多項完全符合我們需求的優勢:
減少延遲:Algolia 的架構針對速度進行了最佳化,即使在重負載下也能確保快速搜尋結果。
可擴展性:隨著我們的用戶群不斷增長,Algolia 可以輕鬆擴展以滿足不斷增長的需求。
高級功能:使用 Algolia 可以輕鬆實現提前輸入和人工智慧增強等功能,使我們能夠快速創新。
在我們的開箱即用功能中,搜尋查詢透過我們的 Rails 應用程式路由,並進入我們的 Postgres 資料庫。根據系統的負載,壞情況場景查詢需要花費 1 秒以上的時間,並且壞情況情況查詢可能會掛起甚至逾時。
典型的查詢在「幾百毫秒」範圍內,這是可以接受的,但並不理想。
我們發現自己處於「可接受」的最佳情況,但沒有出現理想結果的情況。 Algolia 實作中的延遲可能快至個位數毫秒。
更改後,1s請求變成了50ms請求。並且還實現了更快的請求。
查詢直接進入 Algolia 基礎設施,無需在我們的應用程式中花費任何時間 - 為最終用戶節省時間,但也加載到我們的基礎設施上。這也使我們能夠實現跨地域複製,以確保在全球範圍內存取的服務的全球延遲最小。
DEV 已經透過邊緣快取執行,因此大多數初始請求都會以最小的延遲呈現給全球用戶,但動態請求(具有不適合快取的可變輸出的請求)在不同時區可能會產生截然不同的結果。對於某些 Web 使用者來說,在最佳情況下,從純距離角度來看,單次往返的延遲可能會超過 200 毫秒。
你無法改變光速,但我們的 Postgres 資料庫的全域複製並不是我們有頻寬的努力(也許有一天)。
我們方法的主要好處之一是開發人員仍然可以使用 Postgres 啟動 Forem 應用程式。這維護了我們對開源原則的承諾,並確保進入門檻較低。隨著專案的發展和需要增強的功能,Algolia 可以無縫集成,為逐步增強提供清晰的路徑。
預先計算的索引對於良好的搜尋體驗至關重要,但這種模式在內部嘗試和實現並不一定實用。然而,如果第三方工具缺乏有效的程式庫,或者您沒有考慮整合如何使您的業務邏輯複雜化,那麼使用第三方工具也存在陷阱。
algolia-rails gem 相當無縫地插入 Rails 模型,但為了避免模型檔案過載,我們以關注點的形式建立了模組。
module AlgoliaSearchable
module SearchableArticle
extend ActiveSupport::Concern
included do
include AlgoliaSearch
algoliasearch(**DEFAULT_ALGOLIA_SETTINGS, if: :indexable) do
attribute :user do
{ name: user.name,
username: user.username,
profile_image: user.profile_image_90,
id: user.id,
profile_image_90: user.profile_image_90 }
end
searchableAttributes %w[title tag_list body user]
attribute :title, :tag_list, :reading_time, :score, :featured, :comments_count,
:positive_reactions_count, :path, :main_image, :user_id, :public_reactions_count,
:public_reaction_categories
add_attribute(:published_at) { published_at.to_i }
add_attribute(:readable_publish_date) { readable_publish_date }
add_attribute(:body) { processed_html.first(1000) }
add_attribute(:timestamp) { published_at.to_i }
add_replica("Article_timestamp_desc", per_environment: true) { customRanking ["desc(timestamp)"] }
add_replica("Article_timestamp_asc", per_environment: true) { customRanking ["asc(timestamp)"] }
end
end
class_methods do
def trigger_sidekiq_worker(record, delete)
AlgoliaSearch::SearchIndexWorker.perform_async(record.class.name, record.id, delete)
end
end
def indexable
published && score.positive?
end
def indexable_changed?
published_changed? || score_changed?
end
end
end
Algolia 的人工智慧增強功能為我們的漸進式增強策略增添了令人興奮的維度。人工智慧支援的功能可以提供更個人化和相關的搜尋結果,改善整體用戶體驗。這種人工智慧驅動的漸進增強的概念很有趣,並且有可能徹底改變我們對擴展和優化 Web 應用程式的看法。
Algolia 為我們提供了實現提前輸入所需的延遲,並將更多精力放在快速有效的整體搜尋體驗上,但它也使我們能夠在建置過程中為體驗加入智慧。
當用戶最初與搜尋引擎互動時,我們已經實現了“推薦”,並且我們能夠根據用戶開始搜尋之前所在的頁面找到他們可能感興趣的類似內容。我們還將探索 Algolia 的神經搜尋功能,以進一步增強體驗。
這一切都是作為漸進增強來完成的,這是產品設計和工程考慮的問題。我們將其分層到該平台的開源版本能夠實現開箱即用的核心體驗上——或者必須在本地使用 Algolia 依賴項進行開發。該應用程式仍然可以容器化並使用核心依賴項執行。
我們從 Postgres 到 Algolia 的旅程非常成功。我們成功地保留了 Postgres 的簡單性和開放性,同時利用 Algolia 的強大功能來處理增加的流量並減少延遲。 Algolia 提供的人工智慧增強功能代表了一個令人興奮的前沿領域,我們渴望探索其全部潛力。
總而言之,我們的經驗強調了逐步增強的價值,從強大的開源工具開始,然後使用 Algolia 等先進解決方案進行擴展。這種方法確保了靈活性、可擴展性和持續改進,最終為我們的社區提供更好的體驗。
透過分享我們的旅程,我們希望激勵其他開發人員考慮類似的策略,平衡開源工具的簡單性與先進技術的力量,以實現最佳效能和可擴展性。
請繼續關注更多重大改進。快樂編碼。 ❤️
原文出處:https://dev.to/devteam/dev-search-20x-latency-reduction-by-layering-algolia-on-top-of-postgres-3845