Rails + Passenger 解決 Request queue full (configured max. size: 100)
問題透過 Passenger 的相關 HTTP Request 回應 503,出現下面錯誤訊息 1Request queue full (configured max. size: 100) 原因Passenger 使用多個程序 (Process) 來處理 HTTP 請求,預設為 6 個。當大量 Request 進來時,處理不及的會先放在 Queue 等待處理,預設 100 個,當超過 Queue 的上限時會出現這錯誤。 處理請求速度不夠,來不及消化是出現錯誤的原因,然而處理速度不夠的原因就有很多可能,而對應的解決方式也都不同。這邊列出幾個我想得到的原因: 設定問題 程式效能問題 大量 HTTP 請求 程式存在 Bug 底層框架或套件有 Bug 網路上可能會看到有人說去修改 passenger_max_request_queue_size 的設定,來增加 Queue 的大小,但這沒有根本解決問題,還是要找出原因來對做應處理。 設定問題說明比較常見的是 Passenger 使用 ActionCable 時設定沒有正確。ActionCable 使用 Socket 持續連線,所以會常時 ...
Rails ActionCable 效能測試
本篇文章說明連線數上限相關設定,以及實測 ActionCable 預設模式、Standalone 模式和 AnyCable 三種方案的效能比較。 準備首先建立一個 Rails 專案來測試 ActionCable 連線效能,先寫一個簡單的 Channel 12345class MessageChannel < ApplicationCable::Channel def subscribed stream_for 'message_channel' endend 在 config/environments/development.rb 加上 1config.action_cable.disable_request_forgery_protection = true 然後寫一個 Node Client 程式來測試,使用套件 @anycable/web 和 ws 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849imp ...
利用 binstubs 省略 bundle exec
bundle binstubs在 Ruby 中我們可以使用 Bundler 來管理專案的套件和版本,為了確保執行 rake 等指令時,能使用 Gemfile 一致的設定,我們通常會使用 bundle exec 作為開頭來執行指令,例如: 1bundle exec rake db:migrate 不過每次都要打 bundle exec 顯得有些麻煩,這時候我們可以利用 bundle 的 binstubs 來解決這問題。 例如我們想產生 rake 的 binstubs,輸入 1bundle binstubs rake 會在專案下的 bin 資料夾產生 rake 的 script,這時候執行 1./bin/rake 就相當於 1bundle exec rake 如果想產生全部 binstubs,可以執行 1bundle install --binstubs 不過不建議這樣做,他會在該目錄下產生 .bundler 的設定值,之後只要執行 bundle install 都會重新產生 binstubs,如果有使用 spring 之類的套件會被覆蓋掉。 環境變數產生了 binstubs 之後 ...
Ruby 教學 - 陣列 (Array)
語法一般陣列Ruby 中使用中括號 ([]) 來建立陣列,括號中為陣列元素,以逗點 (,) 隔開: 1p [178, 169.99, "30cm", [9527]] # [178, 169.99, "30cm", [9527]] 陣列中的元素也可以是陣列,而成為多維陣列的應用。 字串陣列Ruby 中另外提供了使用百分比符號 (%) 開頭,加上任意的符號 (非字母數字) 包夾字串陣列元素,以空白隔開,有以下兩種方式: %w{xx oo},不解析內容 %W{xx oo},解析內容 規則和單引號雙引號類似,所有的元素都會是字串型別,如下範例: 1234var = 5566p %w{178 169.99 "30cm" [9527] %w{9527} #{var}} # ["178", "169.99", "\"30cm\"", "[9527] ...
Ruby 教學 - 符號 (Symbol)
語法符號類似一種無法修改的字串,使用冒號 (:) 開頭,有以下三種使用方式: 冒號加名稱,:symbol 冒號加單引號字串,:'symbol' 冒號加雙引號字串,:"symbol" 如下範例: 123p :symbol1 # :symbol1p :"symbol2" # :symbol2p :'symbol3' # :symbol3 程式解析當使用字串形式的時候,也具有和字串一樣程式解析的性質,同樣的是雙引號的時候才有: 1234var = "value"p :"#{var}" # :valuep :'#{var}' # :"\#{var}" 不過一般而言,使用 symbol 通常是固定值,所以這種動態的用法不常使用。 符號的操作符號是無法修改的,但有也部分類似字串的方法: 123456symbol = :"I lose"puts sy ...
Ruby 教學 - 字串 (String)
語法字串有四種使用方式: 單引號 雙引號 Heredoc 百分比符號 (%) 以下逐一進行介紹 單引號以兩個單引號包夾一段文字,表示字串內容,使用單引號的字串有一些特徵如下 (與雙引號比較): 逸出字元 (Escape characters) 只有兩種。 逸出字元 \\ 可省略寫作 \,但不可為最後一個字元 (不建議省略)。 不會對字串中的程式進行解析。 所謂逸出字元是為了某些特別的用途或能以此輸入打不出來的字,而定義的一種使用方式,在此的逸出字元以反斜線 (backslash) 開頭。例如,我們使用單引號做包夾,但字串中如果出現單引號,將會誤判為字串結束單引號,所以使用 \' 來表示字串中的單引號。使用單引號的字串可用的逸出字元如下: 符號 說明 ' 單引號字元。 \ 反斜線字元。 一些使用範例如下: 123456789101112puts '基本用法';puts '也可以斷行';puts 'You\'re a good man.'; # You'r ...
Ruby 教學 - 數字 (Numeric)
語法Ruby 的數字型別許多衍生的類別,本文將針對整數和浮點數介紹。從整數的角度來看,它可以用以下四種寫法: 十進位制。 十六進位制,0x 開頭。 八進位制,0 開頭。 二進位制,0b 開頭。 例如: 1234puts 100 # 100puts 0x100 # 256puts 0100 # 64puts 0b100 # 4 浮點數的部分則必須寫出小數點或科學記號表示: 1234567puts 1.23 # 1.23puts 12e3 # 12000.0puts 12E-3 # 0.012puts 1.0 / 3 # 0.3333333333333333puts 1 / 3 # 0, 特別注意puts 10 / 3 * 1.1 # 3.3000000000000003puts 10.0 / 3 * 1.1 # 3.666666666666667 尤其要注意的是除法的部分,如果前面的數字是整數,結果可能不如預期。 數值的範圍整數的部分會自動轉換成大數型別,所以理論上是正負無窮大,浮點數的部分則介於 2.225073858507201 ...
Ruby 教學 - Nil, True 和 False
NilClass語法其他程式語言中的空值 (Null) 在 Ruby 使用 nil 來表示: 12value = nilp value # nil 判斷Ruby 中的物件都只和自己相等,所以即使是和 false 和 0 也和 nil 不相等,如下結果 123puts nil == nil # trueputs nil == false # falseputs nil == 0 # false 另外 Object 提供一個內建函數 nil? 用來判斷物件是否為 nil,只有 nil 會回傳 true 123puts nil.nil? # trueputs false.nil? # falseputs 0.nil? # false 轉型由於 Ruby 所有東西都是物件,包含 nil,所以和其它語言不同之處,它可以進行其他操作,例如呼叫轉型的函式: 1234p nil.to_s # ""p nil.to_i # 0p nil.to_a # []p nil.to_h # {}, Ruby 2.0 之前會出錯 TrueCla ...
Ruby 教學 - 資料型態 (Data Type)
Ruby 的物件導向由於 Ruby 是個完全物件導向的語言,它不像其他語言使用原始型別 (primitive types),例如 int, bool 之類的型別,所有的實字 (literal) 都會被解析成對應的物件來使用。 從上圖可以看到物件的階層關係,所有型別皆繼承自物件 (Object),甚至是模組 (Module) 和類別 (Class)。 之後幾篇文章將逐一介紹一些主要的型別,包含以下項目: 字串(String) 符號(Symbol) 數字(Numeric) 整數(Integer) 浮點數(Float) 陣列(Array) Hash 範圍(Range) Nil True False 物件類別所有型別都是物件,可以利用 class 的屬性來查看物件型別: 1234567891011puts "Hello".class # Stringputs :Hello.class # Symbolputs 1.class # Fixnumputs 999999999999 ...
Ruby 教學 - 基本語法 (Syntax)
如何執行 RubyRuby 有以下三種方式可以執行 Ruby 指令 建立 Ruby 程式檔案最基本的方式當然是建立 Ruby 的檔案,將程式撰寫在檔案中後執行,Ruby 的程式檔案使用 .rb 作為副檔名,例如我們建立一個 hello_world.rb 如下: 1puts "Hello, World!" 接著利用 Ruby 指令執行程式: 1ruby hello_world.rb 執行結果 1Hello, World! 在 Unix 環境下希望他可以直接執行的話,將檔案權限改為可執行,並加上 shebang line 宣告使用 ruby 來執行,如同其他程式語言一樣: 1chmod 755 hello_world.rb 並將 hello_world.rb 改為 123#!/usr/bin/rubyputs "Hello, World!" 之後可直接執行 1./hello_world.rb 使用 Interactive Ruby 介面Ruby 另外提供了一支程式叫 irb,意即 Interactive Ruby,就是可以互動式地執行 R ...