DEV Community

G├╝lsen Keskin
G├╝lsen Keskin

Posted on • Updated on

 

Apache Kafka┬á­čĺź ­čîî ÔťĘ

Apache Kafka, verileri uygun ├Âl├žekte toplamak, i┼člemek, depolamak ve analiz etmek i├žin en pop├╝ler a├ž─▒k kaynakl─▒ ak─▒┼č izleme yaz─▒l─▒m─▒d─▒r. M├╝kemmel performans─▒, d├╝┼č├╝k gecikme s├╝resi, hata tolerans─▒ ve y├╝ksek verimi ile bilinir ve saniyede binlerce mesaj─▒ i┼čleyebilir. (1)

Image description

Apache Kafka a├ž─▒k kaynakl─▒, da─č─▒t─▒lm─▒┼č (distrubuted) bir publish-subscribe (yay─▒nla-abone ol) mesajla┼čma sistemidir.

Esas olarak a┼ča─č─▒daki ├Âzelliklerle tasarlanm─▒┼čt─▒r:

Kal─▒c─▒ mesajla┼čma (Persistent messaging): Apache Kafka, O(1) disk yap─▒lar─▒ ile tasarlanm─▒┼čt─▒r. ├çok b├╝y├╝k boyutlarda bile sabit zamanl─▒ performans sa─člar.

Y├╝ksek aktar─▒m h─▒z─▒ (High throughput)┬á: B├╝y├╝k verileri g├Âz ├Ân├╝nde bulunduran Kafka, ticari donan─▒mlar ├╝zerinde ├žal─▒┼čmak ve saniyede milyonlarca iletiyi desteklemek ├╝zere tasarlanm─▒┼čt─▒r.

Da─č─▒t─▒lm─▒┼č (Distrubuted): Apache Kafka mesajlar─▒ Kafka sunucular─▒ (Kafka servers) ├╝zerinde b├Âl├╝mlendirmeyi ve t├╝ketimi bir t├╝ketici makineleri k├╝mesi (cluster of consumer machines) ├╝zerinde da─č─▒tmay─▒ a├ž─▒k├ža destekler.

├çoklu istemci deste─či (Multiple client support): Apache Kafka sistemi, Java,┬á.NET, PHP, Ruby ve Python gibi farkl─▒ platformlardan istemcilerin kolay entegrasyonunu destekler.

Ger├žek zamanl─▒ (Real time): ├ťretici ileti dizileri (producer threads) taraf─▒ndan ├╝retilen mesajlar, t├╝ketici ileti dizileri (consumer threads) taraf─▒ndan an─▒nda g├Âr├╝lebilmelidir; bu ├Âzellik, Karma┼č─▒k Olay ─░┼čleme (Complex Event ProcessingÔÇŐ-ÔÇŐCEP) sistemleri gibi olay tabanl─▒ (event-based ) sistemler i├žin kritik ├Âneme sahiptir.
Kafka, Hadoop sistemlerinde paralel veri y├╝klemeyi de destekler.

A┼ča─č─▒daki ┼čema, tipik bir b├╝y├╝k veri toplama ve analiz senaryosunu g├Âstermektedir.

Image description

Etkinlik Ak─▒┼č─▒ (Event Streaming) Nedir?
Olay ak─▒┼č─▒, veri tabanlar─▒, sens├Ârler, mobil cihazlar, bulut hizmetleri ve yaz─▒l─▒m uygulamalar─▒ gibi olay kaynaklar─▒ndan olay ak─▒┼člar─▒ bi├žiminde ger├žek zamanl─▒ olarak veri yakalama uygulamas─▒d─▒r ve do─čru bilginin do─čru yerde, do─čru zamanda olmas─▒ i├žin verilerin s├╝rekli ak─▒┼č─▒n─▒ ve yorumlamas─▒n─▒ sa─člar. (3)

Etkinlik Ak─▒┼č─▒n─▒ Ne ─░├žin Kullanabilirim?

ÔÇóBorsalar, bankalar ve sigortalar gibi ├Âdemeleri ve finansal i┼člemleri ger├žek zamanl─▒ olarak i┼člemek i├žin.
ÔÇóLojistik ve otomotiv end├╝strisinde oldu─ču gibi otomobilleri, kamyonlar─▒, filolar─▒ ve g├Ânderileri ger├žek zamanl─▒ olarak izlemek i├žin
ÔÇóIoT cihazlar─▒ndan veya di─čer ekipmanlardan sensor verilerini s├╝rekli olarak yakalamak ve analiz etmek.
ÔÇóPerakende, otel ve seyahat end├╝strisi ve mobil uygulamalar gibi m├╝┼čteri etkile┼čimlerini ve sipari┼člerini toplamak ve an─▒nda tepki vermek.
ÔÇóHastane bak─▒m─▒ndaki hastalar─▒ izlemek ve acil durumlarda zaman─▒nda tedaviyi sa─člamak i├žin durum de─či┼čikliklerini tahmin etmek.
ÔÇóBir ┼čirketin farkl─▒ b├Âl├╝mleri taraf─▒ndan ├╝retilen verileri birbirine ba─člamak, depolamak ve kullan─▒ma sunmak. (3)

┼×irketler Kafkay─▒ Hangi Ama├žlarla Kullan─▒yor?

New York Times: Yay─▒nlanan i├žeri─či ger├žek zamanl─▒ olarak depolamak ve okuyucular─▒n kullan─▒m─▒na sunan ├že┼čitli uygulamalara ve sistemlere da─č─▒tmak i├žin Apache Kafka ve Kafka Ak─▒┼člar─▒ API'sini kullan─▒r.

Pinterest: Reklam altyap─▒lar─▒n─▒n ger├žek zamanl─▒, tahmine dayal─▒ b├╝t├želeme sistemine g├╝├ž sa─člamak i├žin Apache Kafka ve Kafka Streams API'sini b├╝y├╝k ├Âl├žekte kullan─▒r.

Linkedin: Apache Kafka, LinkedIn'de etkinlik ak─▒┼č─▒ verileri (activity stream data) ve operasyonel ├Âl├ž├╝mler i├žin kullan─▒l─▒r. (├ľrne─čin Profilime kimler bakt─▒)

Firefox: Kafka'y─▒, Telemetri, Test Pilotu vb. projeler i├žin son kullan─▒c─▒ taray─▒c─▒s─▒ndan performans ve kullan─▒m verilerini toplamak i├žin kullan─▒r.

Spotify: Kafka, Spotify'da g├╝nl├╝k da─č─▒t─▒m sistemlerinin (log delivery system) par├žas─▒ olarak kullan─▒l─▒r.

Twitter: Storm ak─▒┼č─▒n─▒ i┼čleme altyap─▒lar─▒n─▒n bir par├žas─▒ olarak kafkay─▒ kullan─▒r.

Trivago: Storm'da ak─▒┼č i┼čleme ve uygulama g├╝nl├╝klerinin i┼členmesi i├žin Kafka'y─▒ kullan─▒r.

Urban Airship: Mobil cihazlardan gelen veri noktalar─▒n─▒ ara belle─če almak i├žin Kafka'y─▒ kullan─▒r.

Adidas: Kafka'y─▒ H─▒zl─▒ Veri Ak─▒┼č─▒ Platformunun ├žekirde─či olarak kullanarak kaynak sistemleri entegre eder ve ekiplerin izleme, analiz ve raporlama ├ž├Âz├╝mleri i├žin ger├žek zamanl─▒ olay i┼čleme uygulamas─▒na olanak tan─▒r.

Uber: Apache Kafka, Uber'in genel altyap─▒ y─▒─č─▒n─▒n─▒n temel bir par├žas─▒d─▒r ve ├že┼čitli ├ževrimi├ži ve neredeyse ger├žek zamanl─▒ kullan─▒m durumlar─▒na g├╝├ž sa─člar.

Hacker Rank: Kafka'y─▒ bir hizmet platformu olarak olaylar olarak kullan─▒r. Altyap─▒s─▒ndaki t├╝m dahili faaliyetleri Kafka'da yay─▒nlar ve ├žok ├že┼čitli dahili hizmetler buna abone olur.

Netflix: Ger├žek zamanl─▒ izleme ve olay i┼čleme hatt─▒ i├žin Kafka'y─▒ kullan─▒r.

Oracle: Geli┼čtiricilerin a┼čamal─▒ veri i┼člem hatlar─▒n─▒ uygulamak i├žin OSB'nin yerle┼čik arabuluculuk ├Âzelliklerinden yararlanmalar─▒na olanak tan─▒yan OSB (Oracle Service Bus) adl─▒ Enterprise Service Bus ├╝r├╝n├╝nden Kafka'ya yerel ba─člant─▒ sa─člar.

Rabobank: Hollanda'n─▒n en b├╝y├╝k 3 bankas─▒ndan biridir. M├╝┼čterileri finansal olaylar hakk─▒nda ger├žek zamanl─▒ olarak uyaran bir sistemleri vard─▒r ve bu sistem Kafka Streams (Kafka ak─▒┼člar─▒) kullan─▒larak olu┼čturulmu┼čtur.

Amadeus: Apache Kafka'y─▒, hem ger├žek zamanl─▒ hem de toplu veri i┼čleme i├žin kullan─▒l─▒r.

Airbnb: Apache Kafka'y─▒ istisna takibinde kullan─▒r.

Bandwidth: Faturaland─▒rma ve veri analiti─či i├žin ├ža─čr─▒ ve mesaj veri kay─▒tlar─▒n─▒ i┼člemek i├žin ─░leti┼čim Platformlar─▒nda Kafka'y─▒ kullan─▒r.

ByteDance: ├çevrimi├ži model e─čitimi ve ger├žek zamanl─▒ veri analiti─či gibi ├že┼čitli hizmetler i├žin olaylar─▒ (events) ve g├╝nl├╝kleri (logs) toplamak ├╝zere Kafka'y─▒ bir veri merkezi olarak kullan─▒r.

Cityzen Data: Makine verilerini toplamak, depolamak ve analiz etmek i├žin Kafka'y─▒ kullan─▒r.

DataDog: Kafka'y─▒ veri arac─▒s─▒ olarak kullan─▒r.

DataSift: Kullan─▒c─▒n─▒n veri ak─▒┼č─▒ t├╝ketimini ger├žek zamanl─▒ olarak izlemek i├žin Kafka'y─▒ kullan─▒r.

DataVisor: Doland─▒r─▒c─▒l─▒k alg─▒lama sistemlerimizdeki ├že┼čitli mikro hizmetleri birbirine ba─člayan kritik bir ger├žek zamanl─▒ veri hatt─▒ olarak Apache Kafka'y─▒ kullan─▒r.

Emerging threats: Ortaya ├ž─▒kan tehditler, arama dizinleri, uyar─▒ sistemleri vb. i├žin milyarlarca k├Ât├╝ ama├žl─▒ yaz─▒l─▒m olay─▒n─▒ i┼člemek i├žin olay hatt─▒nda (event pipeline) Kafka'y─▒ kullan─▒r.

LINE: Hizmetlerinin birbiriyle ileti┼čim kurmas─▒ i├žin merkezi bir veri merkezi olarak Apache Kafka'y─▒ kullan─▒r. Her g├╝n y├╝z milyarlarca mesaj ├╝retilir ve ├že┼čitli i┼č mant─▒─č─▒, tehdit alg─▒lama, arama indeksleme ve veri analizini y├╝r├╝tmek i├žin kullan─▒l─▒r. LINE, t├╝keticilerin (consumers) verimli bir ┼čekilde t├╝ketebilece─či alt konular─▒ (sub topics) sa─člayan konular─▒ (topics) g├╝venilir bir ┼čekilde d├Ân├╝┼čt├╝rmek ve filtrelemek i├žin Kafka Streams'ten yararlan─▒r. (1)

Kafka Nas─▒l ├çal─▒┼č─▒r?
Kafka, y├╝ksek performansl─▒ bir TCP a─č protokol├╝ arac─▒l─▒─č─▒yla ileti┼čim kuran sunucular ve istemcilerden olu┼čan da─č─▒t─▒lm─▒┼č bir sistemdir┬á. Bulut ortamlar─▒n─▒n yan─▒ s─▒ra ┼čirket i├ži donan─▒mda, sanal makinelerde ve kapsay─▒c─▒larda devreye al─▒nabilir.

Servers(Sunucular) :
Kafka, birden ├žok veri merkezine veya bulut b├Âlgesine yay─▒labilen bir veya daha fazla sunucu k├╝mesi olarak ├žal─▒┼čt─▒r─▒l─▒r. Bu sunuculardan baz─▒lar─▒, arac─▒lar (brokers) olarak adland─▒r─▒lan depolama katman─▒n─▒ olu┼čturur.
Di─čer sunucular, Kafka'y─▒ ili┼čkisel veritabanlar─▒ (reletional databases) ve di─čer Kafka k├╝meleri gibi mevcut sistemlerinizle b├╝t├╝nle┼čtirmek i├žin verileri olay ak─▒┼člar─▒ (event streams) olarak s├╝rekli olarak i├žeri ve d─▒┼čar─▒ aktarmak i├žin Kafka Connect'i ├žal─▒┼čt─▒r─▒r┬á.
G├Ârev a├ž─▒s─▒ndan kritik kullan─▒m senaryolar─▒n─▒ uygulaman─▒za izin vermek i├žin bir Kafka k├╝mesi (Kafka Cluster), y├╝ksek d├╝zeyde ├Âl├žeklenebilir ve hataya dayan─▒kl─▒d─▒r: sunucular─▒ndan herhangi biri ar─▒zalan─▒rsa, di─čer sunucular, herhangi bir veri kayb─▒ olmadan s├╝rekli i┼člemler sa─člamak i├žin onlar─▒n i┼člerini ├╝stlenir.

Clients (İstemciler) :
Olay ak─▒┼člar─▒n─▒ paralel, ├Âl├žekte ve a─č sorunlar─▒ veya makine ar─▒zalar─▒ durumunda bile hataya dayan─▒kl─▒ bir ┼čekilde okuyan, yazan ve i┼čleyen da─č─▒t─▒lm─▒┼č uygulamalar (distributed applications) ve mikro hizmetler yazman─▒za olanak tan─▒r. Kafka┬á, Kafka toplulu─ču taraf─▒ndan sa─članan d├╝zinelerce istemciyle desteklenen bu t├╝r baz─▒ istemcilerle birlikte g├Ânderilir.(3)

Temel Kavramlar ve Terminoloji

Event (Olay): Bir olay┬á, d├╝nyada veya i┼činizde "bir ┼čey oldu─ču" ger├že─čini kaydeder. Belgelerde kay─▒t veya mesaj olarak da adland─▒r─▒l─▒r. Kafka'ya veri okudu─čunuzda veya yazd─▒─č─▒n─▒zda, bunu olaylar ┼čeklinde yapars─▒n─▒z. Kavramsal olarak, bir olay─▒n bir anahtar─▒ (key), de─čeri (value), zaman damgas─▒(timestamp) ve iste─če ba─čl─▒ meta veri ba┼čl─▒klar─▒ (metadata headers) vard─▒r.

─░┼čte ├Ârnek bir olay:
Event Key (Olay anahtar─▒): "Alice"
Event Value (Etkinlik de─čeri): "Bob'a 200$ ├Âdeme yap─▒ld─▒"
Event Timestamp (Etkinlik zaman damgası) : "25 Haziran 2020, 14:06"

Producers(├ťreticiler)
Olaylar─▒ Kafka'ya yay─▒nlayan (yazan) istemci (client)uygulamalar─▒d─▒r ve consumers (t├╝keticiler ), bu olaylara abone olan (okuyan ve i┼čleyen) ki┼čilerdir. Kafka'da producers(├╝reticiler) ve consumers(t├╝keticiler) birbirlerinden tamamen ayr─▒ ve ba─č─▒ms─▒zd─▒r; bu, Kafka'n─▒n bilinen y├╝ksek ├Âl├žeklenebilirli─čini elde etmek i├žin ├Ânemli bir tasar─▒m ├Â─česidir. ├ľrne─čin, ├╝reticilerin (producers) hi├žbir zaman t├╝keticileri (consumers) beklemesine gerek yoktur. Kafka, olaylar─▒ tam olarak bir kez (exactly-once) i┼čleme yetene─či gibi ├že┼čitli garantiler sa─člar. ├ťreticiler, se├žtikleri konularda veri yay─▒nlar. (4)

Image description

Etkinlikler organize edilir ve konularda (topics) kal─▒c─▒ olarak saklan─▒r. (Varsay─▒lan olarak bu s├╝re 7 g├╝nd├╝r) ├çok basitle┼čtirilmi┼č, bir topic(konu) bir dosya sistemindeki bir klas├Âre benzer ve olaylar o klas├Ârdeki dosyalard─▒r. ├ľrnek bir topic(konu) ad─▒ "├Âdemeler" olabilir. Kafka'daki konular her zaman ├žok ├╝reticili(multi-producer) ve ├žok abonelidir(multi-subscriber) Bir konunun (topic) kendisine olay yazan s─▒f─▒r, bir veya ├žok say─▒da ├╝reticisinin(producers) yan─▒ s─▒ra bu olaylara abone olan s─▒f─▒r, bir veya ├žok say─▒da t├╝ketici (consumers)olabilir. Bir topic deki (konudaki) olaylar gerekti─či kadar okunabilir geleneksel mesajla┼čma sistemlerinin aksine, olaylar t├╝ketimden sonra silinmez. Bunun yerine, Kafka'n─▒n olaylar─▒n─▒z─▒ konu (topic) ba┼č─▒na yap─▒land─▒rma ayar─▒ (per- topic configuration setting) arac─▒l─▒─č─▒yla ne kadar s├╝reyle tutmas─▒ gerekti─čini tan─▒mlars─▒n─▒z, ard─▒ndan eski olaylar at─▒l─▒r. Kafka'n─▒n performans─▒, veri boyutuna g├Âre etkin bir ┼čekilde sabittir, bu nedenle verileri uzun s├╝re saklamak tamamen iyidir.

Konular (Topics) b├Âl├╝mlenmi┼čtir┬á, yani bir topic farkl─▒ Kafka brokerlerinde bulunan bir dizi "buckets" (kovaya) yay─▒lm─▒┼čt─▒r. Verilerinizin bu da─č─▒t─▒lm─▒┼č yerle┼čimi ├Âl├žeklenebilirlik (scability) i├žin ├žok ├Ânemlidir, ├ž├╝nk├╝ istemci (client) uygulamalar─▒n─▒n ayn─▒ anda bir├žok arac─▒dan (brokers) veri okumas─▒na ve yazmas─▒na olanak tan─▒r. Bir topic'e yeni bir olay yay─▒nland─▒─č─▒nda, asl─▒nda konunun b├Âl├╝mlerinden (topic's partitions) birine eklenir. Ayn─▒ olay anahtar─▒na sahip olaylar (├Ârne─čin, bir m├╝┼čteri veya ara├ž kimli─či) ayn─▒ b├Âl├╝me (partition) yaz─▒l─▒r ve Kafka, belirli bir konu b├Âl├╝m├╝n├╝n(topic- partition) herhangi bir t├╝keticisinin (consumer), o b├Âl├╝m├╝n olaylar─▒n─▒ (partition's events) her zaman tam olarak yaz─▒ld─▒─č─▒ s─▒rayla okuyaca─č─▒n─▒ garanti eder.

Bu ├Ârnek topic (konu), P1ÔÇôP4 aras─▒nda d├Ârt b├Âl├╝me (partitions)sahiptir. ─░ki farkl─▒ producer(├╝retici) consumer(istemci), a─č ├╝zerinden konular─▒n b├Âl├╝mlerine olaylar yazarak birbirinden ba─č─▒ms─▒z olarak konuya yeni olaylar yay─▒nlamaktad─▒r. Ayn─▒ anahtara sahip olaylar (┼čekilde renkleri ile g├Âsterilmi┼čtir) ayn─▒ b├Âl├╝me (partition) yaz─▒l─▒r. Her iki ├╝reticinin (producers) de uygunsa ayn─▒ b├Âl├╝me (partition)yazabilece─čini unutmay─▒n.

Verilerinizi hataya dayan─▒kl─▒ ve y├╝ksek d├╝zeyde kullan─▒labilir hale getirmek i├žin┬á, co─črafi b├Âlgeler veya veri merkezleri (datacenters) aras─▒nda bile her topic (konu) ├žo─čalt─▒labilir (replicated)┬á, b├Âylece her zaman bir ┼čeyler ters gitti─činde verilerin bir kopyas─▒na sahip olan birden ├žok broker (arac─▒) vard─▒r. komisyoncular ├╝zerinde bak─▒m yapmak vb. Ortak bir ├╝retim ayar─▒, 3'l├╝k bir ├žo─čaltma fakt├Âr├╝d├╝r (replication factor) yani, verilerinizin her zaman ├╝├ž kopyas─▒ olacakt─▒r. Bu ├žo─čaltma, konu b├Âl├╝mleri (topic- partitions) d├╝zeyinde ger├žekle┼čtirilir. (3)

Mesajla┼čman─▒n geleneksel olarak iki modeli vard─▒r:

1.)Queuing (Kuyru─ča alma)
Kuyrukta (queue), bir t├╝ketici havuzu (pool of consumers) bir sunucudan okuyabilir ve her ileti bunlardan birine gider. (T├╝m consumer'lar─▒ 1 grup i├žerisine koymal─▒s─▒n─▒z (5))

Image description

2.) Publish- Subscribe (Yay─▒nla- abone ol)
Publish-subscribe 'da (yay─▒nla-abone ol) ileti t├╝m t├╝keticilere (consumers) yay─▒nlan─▒r. (Her bir consumer'─▒ kendine ait ba┼čka bir Consumer Group i├žine aktarmal─▒s─▒n─▒z (5))

Image description

Kafka, her ikisini de genelle┼čtiren tek bir t├╝ketici soyutlamas─▒ sunar t├╝ketici grubu (consumer group)

T├╝keticiler (Consumers ) kendilerini bir t├╝ketici grubu (Consumer group) ad─▒yla etiketlerler ve bir konuya (topic) yay─▒nlanan her ileti, abone olan (subscribing ) her t├╝ketici grubu i├žindeki bir t├╝ketici ├Ârne─čine (consumer instance ) teslim edilir.
T├╝ketici ├Ârnekleri ayr─▒ i┼člemlerde (processes) veya ayr─▒ makinelerde olabilir

T├╝m t├╝ketici ├Ârnekleri (consumer instances ) ayn─▒ t├╝ketici grubuna (consumer group) sahipse, bu, t├╝keticiler ├╝zerindeki geleneksel kuyruk dengeleme y├╝k├╝ (traditional queue balancing load ) gibi ├žal─▒┼č─▒r.
T├╝m t├╝ketici ├Ârneklerinin (consumer instances) farkl─▒ t├╝ketici gruplar─▒ (consumer groups) varsa, bu publish-subscribe (yay─▒nla-abone ol) gibi ├žal─▒┼č─▒r ve t├╝m iletiler t├╝m t├╝keticilere(consumers) yay─▒nlan─▒r.(4)

Image description

ZooKeeper:
ZooKeeper, yap─▒land─▒rma bilgilerini korumak, adland─▒rmak, da─č─▒t─▒lm─▒┼č senkronizasyon sa─člamak ve grup hizmetleri sa─člamak i├žin merkezi bir hizmettir. Bu t├╝r hizmetlerin t├╝m├╝ da─č─▒t─▒lm─▒┼č uygulamalar taraf─▒ndan bir ┼čekilde veya ba┼čka bir ┼čekilde kullan─▒l─▒r.
ZooKeeper ayr─▒ca da─č─▒t─▒lm─▒┼č uygulamalar i├žin y├╝ksek performansl─▒ bir koordinasyon hizmetidir.

Adland─▒rma, yap─▒land─▒rma y├Ânetimi (configuration management), senkronizasyon ve grup hizmetleri gibi ortak hizmetleri basit bir aray├╝zde sunar, b├Âylece bunlar─▒ s─▒f─▒rdan yazmak zorunda kalmazs─▒n─▒z.

Grup y├Ânetimi, lider se├žimi (leader election) ve varl─▒k protokollerini (presence protocols) uygulamak i├žin haz─▒r olarak kullanabilirsiniz. Ve kendi ├Âzel ihtiya├žlar─▒n─▒z i├žin ├╝zerine in┼ča edebilirsiniz. (4)

Kaynaklar:
(1) https://kafka.apache.org/powered-by
(2)Garg, N. (2013). Apache kafka (pp. 30ÔÇô31). Birmingham, UK: Packt Publishing.
(3) https://kafka.apache.org/documentation/#gettingStarted
(4) Thein, K. M. M. (2014). Apache kafka: Next generation distributed messaging system. International Journal of Scientific Engineering and Technology Research, 3(47), 9478ÔÇô9483.
(5) https://www.youtube.com/watch?v=ZphPT3r6fnU&t=3339s

Top comments (0)

Super Useful CSS Resources

A collection of 70 hand-picked, web-based tools which are actually useful.
Each will generate pure CSS without the need for JS or any external libraries.