Saturday, December 17, 2016

Sebuah cara untuk mengatasi error code 429 pada Elasticsearch 2.3.5

(node:2159) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 155): Error: [es_rejected_execution_exception] rejected execution of org.elasticsearch.transport.TransportService$4@518af8b7 on EsThreadPoolExecutor[index, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@ce8e2a8[Running, pool size = 1, active threads = 1, queued tasks = 200, completed tasks = 1030]] :: {"path":"/data/customers-from-orders/%2B62813678456","query":{},"body":"{\"name\":\"Antonov\",\"phone\":\"+6281XXXXXXX\"}","statusCode":429,"response":"{\"error\":{\"root_cause\":[{\"type\":\"es_rejected_execution_exception\",\"reason\":\"rejected execution of org.elasticsearch.transport.TransportService$4@518af8b7 on EsThreadPoolExecutor[index, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@ce8e2a8[Running, pool size = 1, active threads = 1, queued tasks = 200, completed tasks = 1030]]\"}],\"type\":\"es_rejected_execution_exception\",\"reason\":\"rejected execution of org.elasticsearch.transport.TransportService$4@518af8b7 on EsThreadPoolExecutor[index, queue capacity = 200, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@ce8e2a8[Running, pool size = 1, active threads = 1, queued tasks = 200, completed tasks = 1030]]\"},\"status\":429}"}

Ya, itulah log dari elasticsearch 2.3.5 yang saya temukan ketika melakukan bulk insert / update ke elasticsearch.

Saya memiliki data di firebase realtime database namun saat blog ini ditulis, firebase realtime database belum memiliki fungsi pencarian selengkap dengan RDBMS, misal MySQL, PostgreSQL ataupun selengkap elasticsearch. Untuk keperluan pencarian tersebut, maka saya men-sync-kan data tersebut ke elasticsearch, dengan harapan dapat memanfaatkan fitur-fitur di elasticsearch untuk mencari pada data tersebut.

Namun karena data yang sudah mulai banyak, dan proses read data secara asynchronous dari firebase, saya menemukan error dengan code 429 tersebut. Ada banyak cara untuk menghandle hal ini, misal :
  • melakukan insert / update ke elasticsearch secara batch
  • memperbesar queue threadpool elasticsearch
  • memperbesar size threadpool elasticsearch
  • dan lain-lain :)

Saya mencoba dengan cara yang kedua, memperbesar queue. Queue threadpool elasticsearch 2.3.5 masih dapat diubah, namun jika menggunakan elasticsearch 5.x, configurasi tersebut sudah tidak bisa diubah.

Salah satu cara mengubah configurasi queue threadpool, yaitu :
  • Perubahan Permanen
  • Perubahan ini tetap berlaku walaupun server elasticsearch direstart.
    curl -XPUT localhost:9200/_cluster/settings -d '{ "persistent" : { "threadpool.index.queue_size" : 1000 } }'
  • Perubahan Sementara
  • Perubahan ini tidak berlaku setelah server elasticsearch direstart.
    curl -XPUT localhost:9200/_cluster/settings -d '{ "transient" : { "threadpool.index.queue_size" : 1000 } }'

Setelah mengubah configurasi tersebut, error pun sudah tidak muncul lagi. Namun hal tersebut masih dapat muncul kembali apabila request insert/update ke elasticearch tidak dapat ditampung di queue threadpool yang baru.

Semoga Bermanfaat dan Tetap Semangat !!!

No comments:

Post a Comment