11/08/2018, 21:17

Shadow proxy và TIP pattern

Chắc chưa nhiều bạn từng nghe đến 2 cụm từ shadow proxy và TIP pattern. Cụm từ shadow proxy thì có lẽ không thông dụng bởi vì nó được dùng chủ yếu ở Nhật, khi mà thông tin chủ yếu là bằng tiếng Nhật. Cụm từ TIP pattern thì tất nhiên là các bạn không biết rồi, vì tôi nghĩ ra mà :v ...

Chắc chưa nhiều bạn từng nghe đến 2 cụm từ shadow proxy và TIP pattern.
Cụm từ shadow proxy thì có lẽ không thông dụng bởi vì nó được dùng chủ yếu ở Nhật, khi mà thông tin chủ yếu là bằng tiếng Nhật.
Cụm từ TIP pattern thì tất nhiên là các bạn không biết rồi, vì tôi nghĩ ra mà :v

alt text

Shadow proxy rất đơn giản , chỉ đơn thuần là một server giúp chúng ta nhân đôi request lên, vậy thôi :D.
Vậy còn TIP pattern? Cụm từ này còn đơn giản hơn nữa

TIP pattern = Test In Production pattern

=)))

Nhiều bạn sẽ thắc mắc là tại sao lại cần nhân đôi request lên, request nhân đôi lên thì nó sẽ đi đâu, tốn tài nguyên, dẹp!
Cơ mà tôi sẽ thuyết phục bạn là bạn sẽ cần shadow proxy trong một số trường hợp :D.

Khi bạn code lại hay refactoring lại một đoạn logic cực kì quan trọng. Tất nhiên là sự đúng đắn của logic sẽ được đảm bảo bằng nhiều cách khác nhau như unit test, integration test .. Tuy nhiên có những thứ mà bạn khó có thể đảm bảo được như là: Performance với cùng một kiểu access giống như production hay là tính đa dạng của kiểu access. Chung qui lại, bạn ước là

"Giá" mà có thể "forward" toàn bộ access của production server vào test server để xem nó ra sao thì sướng quá.

Shadow proxy sẽ giúp bạn trong trường hợp này :D.
Và việc sử dụng shadow proxy sẽ giúp bạn thực hiện TIP pattern, hay là Test in Production pattern =))

Về cơ bản thì Shadown proxy chỉ là một việc rất đơn giản là : nhận request, và ném request đó ra 1 production server + N sandbox server khác.Kết quả trả về cho client sẽ được lấy từ production server.
Bạn có thể tự viết một cái shadow proxy của riêng bạn, tôi rất hoan nghênh, cơ mà nếu thời gian không có nhiều thì bạn có thể dùng một số hàng "có sẵn". Hiện tại thì mình đang sử dụng một gem gọi là kage.

Gem này về cơ bản là wrapper của một gem khá nổi tiếng khác là em-proxy, và thêm cho chúng ta một số DSL để dễ sử dụng hơn.
Cách dùng khá đơn giản là bạn chỉ cần cài kage

gem instal kage

Sau đó viết đoạn script để sử dụng kage

require 'kage'

def compare(a, b)
  p [a, b]
end

Kage::ProxyServer.start do |server|
  server.port = 8090
  server.host = '0.0.0.0'
  server.debug = false

  # backends can share the same host/port
  server.add_master_backend(:production, 'localhost', 80)
  server.add_backend(:sandbox, 'localhost', 80)

  server.client_timeout = 15
  server.backend_timeout = 10

  # Dispatch all GET requests to multiple backends, otherwise only :production
  server.on_select_backends do |request, headers|
    if request[:method] == 'GET'
      [:production, :sandbox]
    else
      [:production]
    end
  end

  # Add optional headers
  server.on_munge_headers do |backend, headers|
    headers['X-Kage-Session'] = self.session_id
    headers['X-Kage-Sandbox'] = 1 if backend == :sandbox
  end

  # This callback is only fired when there are multiple backends to respond
  server.on_backends_finished do |backends, requests, responses|
    compare(responses[:production][:data], responses[:sandbox][:data])
  end
end

Chắc bạn nào đã quen với ruby thì nhìn đoạn code trên chúng ta có thể hiểu được kage có thể làm được gì. Mình sẽ tóm tắt lại ở dưới đây:

  • kage có thể add thêm master backend (là server dùng để trả request về cho client) , và có thể add thêm N sandbox backend, chính là các server bạn muốn "test" một logic nào đó
  • kage có thể chỉ nhân request ra với một method nào đó (ví dụ là GET), và không làm gì với các request còn lại. Lý do bạn nên làm việc này là shadow proxy chỉ thích hợp để test với các request "không thay đổi database", vì nếu có thay đổi database thì sẽ không thể nhân request ra được, vì việc đó sẽ làm loạn "trạng thái" của hệ thống.
  • kage có thể add thêm header
  • kage có thể hook vào khi xử lý đã thực hiện xong và làm gì đó (ví dụ so sánh request)

Kết luận

Giờ chúng ta đã có thể thoải mái "test trên production" được rồi, vì đã có shadow proxy :v

0