{"id":28450098,"url":"https://github.com/buraksenyurt/kiwi-store","last_synced_at":"2026-03-05T11:33:33.176Z","repository":{"id":295857752,"uuid":"990648145","full_name":"buraksenyurt/kiwi-store","owner":"buraksenyurt","description":"Deneysel ve hafifsiklet bir key-value store çalışmasıdır.","archived":false,"fork":false,"pushed_at":"2025-09-13T16:49:11.000Z","size":279,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-30T13:27:31.339Z","etag":null,"topics":["asynchronous-programming","clap-rs","experimental","key-value-store","poc","rust","rust-lang","tokio-rs"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/buraksenyurt.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-26T12:29:01.000Z","updated_at":"2025-09-13T16:49:15.000Z","dependencies_parsed_at":"2025-05-27T18:49:25.017Z","dependency_job_id":null,"html_url":"https://github.com/buraksenyurt/kiwi-store","commit_stats":null,"previous_names":["buraksenyurt/kiwi-store"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/buraksenyurt/kiwi-store","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fkiwi-store","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fkiwi-store/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fkiwi-store/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fkiwi-store/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/buraksenyurt","download_url":"https://codeload.github.com/buraksenyurt/kiwi-store/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/buraksenyurt%2Fkiwi-store/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30122189,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T11:11:57.947Z","status":"ssl_error","status_checked_at":"2026-03-05T11:11:29.001Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asynchronous-programming","clap-rs","experimental","key-value-store","poc","rust","rust-lang","tokio-rs"],"created_at":"2025-06-06T15:06:28.310Z","updated_at":"2026-03-05T11:33:33.155Z","avatar_url":"https://github.com/buraksenyurt.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kiwi-Store\n\nDeneysel ve hafifsiklet bir key-value store çalışmasıdır. Amaç geliştirmesi kolay, in-memory çalışan ve başlangıçta tek node üzerinden işleyen bir sistem kurmaktır. Çalışmada yer alan uygulamalar ve genel özellikleri şöyledir.\n\n- Server Side _(kiwi-store-server)_\n  - Sadece string türden key ve value çiftleri tutar\n  - Key bilgisi 20, Value bilgisi 100 karakterden fazla olamaz\n  - Key-Value bilgileri in-memory saklanır\n  - Sunucu tarafı Tcp protokolü üzerinden çalışır\n  - Tamamen asenkrondur\n- CLI _(kiwi-store-client)_\n  - Key, Value eklenmesi, çekilmesi, silinmesi gibi temel işlevleri sağlayan terminal uygulamasıdır\n- Tester _(kiwi-store-loadtest)_\n  - Server side için load, fuzz test işleten bir test koşucusudur\n    - Test değerleri postgresql dosyasına yazılır\n- Metrics Api _(kiwi-store-metric-api)_\n  - Load/Fuzz testlerine ait metrikleri verir\n- Dashboard _(dashboard/index.html)_\n  - Test metrikleri ile ilgili ölçümleri gösteren board'dur.\n- .Net Port Library _(KiwiStore)_\n  - KiwiStore'u .net uygulamalarında kullanabilmek için yazılmış kütüphane\n  - Kütüphane testlerin kolay yapılabilmesi için [Nuget ortamına da](https://www.nuget.org/packages/KiwiStore/) yüklenmiştir.\n- .Net Test App _(KiwiStore.Test.Api)_\n  - KiwiStore paketinin DI üzerinden kullanımının test edildiği basit Web API hizmeti\n  - Set, Get, Remove, List ve diğer tüm hizmetler için örnek kullanımlar sağlar [Postman Koleksiyonuna buradan ulaşılabilir](Key-Value%20Store%20.Net%20Api.postman_collection.json)\n\n## Runtime\n\nGerekli ortamlar için docker compose kullanılabilir. _(Sunucu uygulama, metrik ölçümlerinin depolanması için postgresql)_\n\n```bash\ndocker-compose up -d\n```\n\nİstemci tarafı için komut satır aracı kullanılabilir.\n\n```bash\n# cargo run ile\n# kiwi-store-client klasöründe\n\n# Yeni bir key-value eklemek\ncargo run -- set smtp fake\n\n# Value değeri çekmek\ncargo run -- get smtp\n\n# İçinde farklı karakterler olan value eklemek\ncargo run -- set conn \"data source=localhost;database=Northwind;integrated security=sspi\"\n\n# Key listesini çekmek\ncargo run -- list\n\n# Bir key-value çiftini çıkarmak\ncargo run -- remove smtp\n\n# Genel istatistikleri elde etmek\ncargo run -- stats\n\n# Ping-Pong oynamak\ncargo run -- ping\n\n# Geçersiz komut girmek\ncargo run -- set Itsalonglonglonglongwaywemusttogo \"lorem ipsum connnection string\"\ncargo run -- set ConnectionString \"data source = localhot; database = Nortwhing; integrated security=sspi; mars = true; distributed transaction=off\"\n```\n\nLoad ve Fuzz test yapan kiwi-store-loadtest uygulaması da komut satırından aşağıdaki gibi çalıştırılabilir.\n\n```bash\n# 10 istemci, istemci başına 50 komut\ncargo run -- -k load -c 10 -s 50\n\n# 100 istemci, istemci başına 1000 komut\ncargo run -- -k load -c 100 -s 1000\n\n# 10 istemci, istemci başına 100 geçersiz komut\ncargo run -- -k fuzz -c 10 -s 100\n```\n\n## Metric Toplama\n\nTest aracının topladığı metrikler text tabanlı olarak CSV formatında tutulabileceği gibi Postgresql veri tabanında bir tabloda da tutulabilir.\n\n```sql\nCREATE TABLE metrics (\n    id SERIAL PRIMARY KEY,\n    time_stamp TIMESTAMPTZ NOT NULL,\n    test_type TEXT NOT NULL,\n    total_commands INT NOT NULL,\n    successful_commands INT NOT NULL,\n    failed_commands INT NOT NULL,\n    average_latency_ms DOUBLE PRECISION NOT NULL\n);\n```\n\nToplanan metrikleri dashboard uygulamasına vermek içinse basit bir Web API hizmeti kullanılmaktadır _(kiwi-store-metric-api)_ Bu hizmet şu an için 5556 nolu porttan hizmet verir. Bu servisi kullanarak son 50 test verisine ait çizgi grafiğini de dashboard klasöründe yer alan index.html aracılığı ile görebiliriz. Aşağıdakine benzer bir çıktı olacaktır. Burada zaman bazlı bir çıktı söz konusudur. Bunun anlamlı olması için\nbelli periyotlarda aynı load ve fuzz oranlarına göre test yapılması daha iyi olabilir.\n\n![Sample dashboard](SampleDashboard_00.png)\n\n## .Net Tarafında Kullanım\n\nKey-Value store'un .net projelerinden kullanılabilmesi için sonradan Nuget paketi haline de getirilebilecek bir kütüphane yazılmıştır. Nuget paketi KiwiStore.Test.Api isimli Web API hizmetinde basitçe ele alınmıştır. İlgili örnekte KiwiStore bilgileri appsettings.json dosyasından karşılanır. Örnek çalışma zamanı görüntüsü aşağıdaki gibidir.\n\n![Web Api Runtime 00](WebApiRuntime_00.png)\n\n## Planlanan Ekler\n\n- [x] Load ve Fuzz test yapan bir uygulama.\n- [x] Test çıktılarının Postgresql tablosuna yazdırılması.\n- [x] Metrik ölçümlerini dışarıya veren API hizmetinin yazılması.\n- [x] Metrik ölçümleri için basit bir montoring dashboard.\n- [x] .Net ile entegrasyon kütüphanesi.\n- [x] Nuget paketi yardımıyla key-value store kullanan örnek uygulama.\n- [ ] Mesajların şifrelenerek iletiminin sağlanması.\n- [ ] Multi-Node Çalışma.\n\n## Problemler\n\n- [x] Key store'da hiçbir eleman kalmadığında client taraftaki list komutu sonsuz döngüde kalıyor.\n- [ ] Windows ortamında docker container portu zaman zaman kullanımda kalıyor ve yenisi başlatılamıyor.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fburaksenyurt%2Fkiwi-store","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fburaksenyurt%2Fkiwi-store","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fburaksenyurt%2Fkiwi-store/lists"}