Browse Source

CLDC-4066: Increase our resilience to an OS Places outage (#3104)

* CLDC-4066: Implement a debounce on address search

disappointingly the underlying library https://github.com/alphagov/accessible-autocomplete doesn't have this as an option, though we can implement one ourselves in the fetch code

* CLDC-4066: Reduce read timeout for OS Places APIs 30 -> 15

in practice waiting up to 1 min 30 for requests could cause too many threads to be blocked under periods of slow OS Places API

this reduces the max wait time to 45 seconds, as requested by CORE

* CLDC-4066: Lint

* CLDC-4066: Fix uprn timeout to match address search
pull/3122/head^2 v0.5.23
Samuel Young 3 weeks ago committed by GitHub
parent
commit
14c8fa63da
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 18
      app/frontend/controllers/address_search_controller.js
  2. 2
      app/services/address_client.rb
  3. 2
      app/services/uprn_client.rb

18
app/frontend/controllers/address_search_controller.js

@ -4,10 +4,28 @@ import 'accessible-autocomplete/dist/accessible-autocomplete.min.css'
const options = []
let latestQueryId = 0
const sleep = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms))
}
const fetchOptions = async (query, searchUrl) => {
if (query.length < 2) {
throw new Error('Query must be at least 2 characters long.')
}
// implement a debounce
// this is because this API has periods of high latency if OS Places has an outage
// making too many requests can overwhelm the number of threads available on the server
// which can in turn cause a site wide outage
latestQueryId++
const myQueryId = latestQueryId
await sleep(500)
if (myQueryId !== latestQueryId) {
throw new Error('Outdated query, ignoring result.')
}
try {
const response = await fetch(`${searchUrl}?query=${encodeURIComponent(query.trim())}`)
return await response.json()

2
app/services/address_client.rb

@ -35,7 +35,7 @@ private
client.use_ssl = true
client.verify_mode = OpenSSL::SSL::VERIFY_PEER
client.max_retries = 3
client.read_timeout = 30 # seconds
client.read_timeout = 15 # seconds
client
end

2
app/services/uprn_client.rb

@ -39,7 +39,7 @@ private
client.use_ssl = true
client.verify_mode = OpenSSL::SSL::VERIFY_PEER
client.max_retries = 3
client.read_timeout = 30 # seconds
client.read_timeout = 15 # seconds
client
end

Loading…
Cancel
Save