“Rust’ın en taze meyvelerinden MeiliSearch ve AWS Chalice ile Multiprocessing Serverless“ Ortaya Karışık Yazılım Serisi — 6
Previously on Ortaya Karışık Yazılım Serisi (Kah bugdan dökülür, kah para yazar en hazin sözler ‘server’ diye başlar. AWS ECS & Chalice ile serverless) => LINK
Aslında herşey Elasticsearch docker compose dosyasını AWS ECS ile tam istediğim gibi deploy edememem ile başladı..
Kendime sordum “lan bu ne SearchEngine mevzusunda illa elasticsearch mü kullanmak zorundayız?” tabi ki hayır ! Bu beni daha küçük ölçekli veritabanları aramaya itti ve tabi ki yolumuz github.. bir çok veritabanı inceledikten sonra kullanım basitliği ve kapladığı alan açısından“meilisearch” bana mantıklı geldi.
Bölüm-1 Nedir bu MeiliSearch
MeiliSearch RESTful arama API'sidir. Son kullanıcıları için hızlı ve alakalı bir arama deneyimi isteyen herkes için kullanıma hazır bir çözüm olmayı amaçlamaktadır.
Verimli arama motorları genellikle önemli miktarda kaynak gerektirir. MeiliSearch ise özetle açık kaynak “fakirler için elasticsearch” diyebiliriz.
Akıllara direk performans kıyaslaması gelebilir bu kısımla ilgilenen arkadaşlar ise şu linke gidebilirler. <Kıyaslamalar>
Vakit BamGüm Girişme vaktidir
Yine klasik docker-compose dosyamız ile meilisearch’ü ayağa kaldırıyoruz.
DB şifresi olarak “testingMeili” kullandım. Kullanmak istemiyorsanız enviroment kısmını silmeniz yeterli olur.
environment:
- MEILI_MASTER_KEY=testingMeili
Eğer veritabanınıza şifre koyduysanız bağlanmanız için header kısmına “X-Meili-API-Key” ile birlikte şifrenizi göndermeyi unutmayın..
Yine dokümantasyonu okuyarak. Index, create, delete mevzularına bakabilirsiniz aşırı derecede basit fakat python tarafında kullanacağımız kütüphane maalesef hata gösterme tarafında yetersiz. Hangi hatayı aldığınızı anlamıyorsunuz genelde alakasız hatalar basıp duruyor bu tat kaçırıcı. Aşağıda yazdığım basit bir python örneği bulabilirsiniz.
Burada bahsetmem gereken iki önemli nokta var ki bence inanılmaz saçma mevzular;
1 ) get_or_create_index() isimli fonksiyon var ama index yoksa create etmiyor.
2) options olarak primaryKey olarak verdiğimiz yerde eğer “.”(nokta) kullanarak Id üretmeye çalışıyorsanız hata alırsınız. örnek: “com.bla.com”
3) 100k doküman bulk sekilde db insert etmeniz 1–2 saniye bile sürmüyor fakat veritabanında bunu görmeniz uzun sürebiliyor(10–20 saniye)
4) 100k dokümanı delete fonksiyonu ile silemedim sürekli kitlenip durdu benim hatam olabilir deneyip sonuç alanlar paylaşırsa süper olur
Şimdi gelelim belalı kısıma..
Daha önceki yazı dizilerimde basit şekilde Chalice örnekleri yapmıştım fakat multiprocessing örneği yapana kadar gerçekten ciğerim soldu. Python tarafında normalde multiprocessing pool olarak kullanıp localde keyfime bakarken bu aws chalice tarafında kabusa dönüştü.
Chalice “multiprocessing.SemLock” problems..
from multiprocessing import Process, Pool
“As far as I can tell, multiprocessing won’t work on AWS Lambda because the execution environment/container is missing /dev/shm
You can run routines in parallel on AWS Lambda using Python’s multiprocessing module but you can’t use Pools or Queues as noted in other answers. A workable solution is to use Process and Pipe as outlined in this article”[6]
Özetle diyor ki Python’un çoklu işlem modülünü kullanarak AWS Lambda üzerinde paralel olarak rutinleri çalıştırabilirsiniz, ancak Pool ve Que kullanamazsın. Daha sonra yaptığım 2–3 günlük araştırma sonucunda 2 farklı yöntem ile çalıştırmayı başardım. İlk yöntem yeni bir pool yazmak.
İkinci bulduğum yöntem ise “concurrent” büyüsü.
Eşzamanlılığın(Concurrent) sözlük tanımı eşzamanlı oluşumdur. Python’da, aynı anda meydana gelen şeyler farklı isimlerle (thread, task, process) çağrılır, ancak yüksek düzeyde, hepsi sırayla çalışan bir talimat dizisine atıfta bulunur.
Thread, task, processler yalnızca yüksek bir seviyeden görüntülediğinizde aynı olduğu ortaya çıkıyor. Detayları araştırmaya başladığınızda, hepsi biraz farklı şeyleri temsil eder.
Threading ve asyncio her ikisi de tek bir işlemcide çalışır ve bu nedenle tek seferde yalnızca bir tane çalıştırır.
Deploy kısımları
sudo docker context create ecs beybiliboi
sudo docker context use beybiliboi
sudo docker compose up
sudo docker compose ps
docker compose ps sonrasında elde etmiş olduğumuz URL artık bizim nereye bağlanmamız gereken yer olduğunu işaret edeceği için tek yapmamız gereken şey kod tarafında değişiklik yapmak ve chalice deploy etmek.
sudo chalice deploy
ve artık serverless bir meilisearch, multiprocessing çalışan bir chalice’e sahibiz.
Cold start
Daha önce cold start olayından bahsetmiştim. Serverless olarak kullandığımı docker dosyası kullanılmadığı zaman kendini pasife alıyor ardından istek attığımız zaman ilk önce ayağa kalkamaya çalışıyor sonra aktif oluyor derken zaman baya geçiyor. Bunu aşmak için 10 dakikada bir durumunu sorgulayıp istek atabiliriz. Büyük olasılık daha iyi yöntemler vardır ama benim aklıma gelen en basit yöntem bu oldu. İlk önce klasik aynı regionda mıyız kontrol edelim
my_session = boto3.session.Session()
my_region = my_session.region_name
Şimdi benim karşılaştığım hata şu oldu boto3 kısmında “ECS” kullanmak istiyorum fakat list tasks kısmında sürekli “cluster yok ki kardeş” diye hata alıyorum.[2]
ecs error: “An error occurred (ClusterNotFoundException) when calling
AWS paneline bakıyorum var boto3 geliyorum yok derken. AWS panelinde oluşmuş olan serverless-play-scraper isimli cluster adımı
aws ecs describe-clusters --cluster <your-cluster>
şeklinde tamamladım
aws ecs describe-clusters --cluster serverless-play-scraper
import boto3
from pprint import pprint
client = boto3.client('ecs')
response = client.list_tasks(cluster='serverless-play-scraper')
client.run_task(cluster="serverless-play-scraper",
task=response["taskArns"][0])
Artık ECS üzerinde tasklarımı görebiliyor ve yönetebiliyorum. Mutlaka ama mutlaka dokümantasyona bakmak gerekiyor. [4]
Yine klasik kapanışımız ile kapatalım. Ortaya Karışık Yazılım Serisi’ne kendinizi yakın hissediyorsanız paylaşarak destek olabilirsiniz yaptığım hata ve öneriler için Twitter üzerinden ulaşabilirsiniz.
“Mahallenizin emekli albayı Apache Airflow“ Ortaya Karışık Yazılım Serisi — 7
Referanslar
- https://docs.meilisearch.com/guides/advanced_guides/authentication.html#master-key
- https://stackoverflow.com/questions/39452982/ecs-error-an-error-occurred-clusternotfoundexception-when-calling-the
- https://stackoverflow.com/questions/37514810/how-to-get-the-region-of-the-current-user-from-boto
- https://boto3.amazonaws.com/v1/documentation/api/1.9.42/reference/services/ecs.html#ECS.Client.describe_task_definition
- https://docs.meilisearch.com/resources/comparison_to_alternatives.html#about-meilisearch
- https://stackoverflow.com/questions/34005930/multiprocessing-semlock-is-not-implemented-when-running-on-aws-lambda