The Kafka Summit version of this talk is more practical and includes code examples which walk though how to build a streaming application with Kafka Streams.
19. 19
Spectrum of use cases
Finer Grained,
Collaborative,
Connected
Courser Grained,
Non-collaborative,
Disconnected
Notification Data Replication
20. 20
Buying an iPad (with REST/RPC)
Submit
Order
shipOrder() getCustomer()
Orders
Service
Shipping
Service
Customer
Service
Webserver
21. 21
Events for Notification Only
Message Broker (Kafka)
Submit
Order
Order
Created
getCustomer()
REST
Notification
Orders
Service
Shipping
Service
Customer
Service
Webserver
KAFKA
23. 23
Events for Data Locality
Customer
Updated
Submit
Order
Order
Created
Data is
replicated
Orders
Service
Shipping
Service
Customer
Service
Webserver
KAFKA
41. 41
KStreams Code for Inventory Service
//Create a State Store
kStreams.addStateStore(Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore(STOCK_STORE_NAME));
//Process
kStreams.stream(“Orders”)
.join(inventory, KeyValue::new)
.transform(InventoryValidator::new, STOCK_STORE_NAME)
.to(“OrderValidations”);
42. 42
KStreams Code for Inventory Service
//Create a State Store
kStreams.addStateStore(Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore(STOCK_STORE_NAME));
//Process
kStreams.stream(“Orders”)
.join(inventory, KeyValue::new)
.transform(InventoryValidator::new, STOCK_STORE_NAME)
.to(“OrderValidations”);
43. 43
KStreams Code for Inventory Service
//Create a State Store
kStreams.addStateStore(Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore(STOCK_STORE_NAME));
//Process
kStreams.stream(“Orders”)
.join(inventory, KeyValue::new)
.transform(InventoryValidator::new, STOCK_STORE_NAME)
.to(“OrderValidations”);
44. 44
KStreams Code for Inventory Service
//Create a State Store
kStreams.addStateStore(Stores.keyValueStoreBuilder(
Stores.persistentKeyValueStore(STOCK_STORE_NAME));
//Process
kStreams.stream(“Orders”)
.join(inventory, KeyValue::new)
.transform(InventoryValidator::new, STOCK_STORE_NAME)
.to(“OrderValidations”);
45. 45
Validate and update State Store
public KeyValue transform(…) {…
Long reserved = reservedStore.get(order.getProduct());
if (inWarehouse - reserved - order.quantity() >= 0) {
int amount = reserved + order.getQuantity();
reservedStore.put(order.product(), amount);
pass();
} else {
fail()
}
…
}
46. 46
Validate and update State Store
public KeyValue transform(…) {…
Long reserved = reservedStore.get(order.getProduct());
if (inWarehouse - reserved - order.quantity() >= 0) {
int amount = reserved + order.getQuantity();
reservedStore.put(order.product(), amount);
pass();
} else {
fail()
}
…
}
47. 47
Validate and update State Store
public KeyValue transform(…) {…
Long reserved = reservedStore.get(order.getProduct());
if (inWarehouse - reserved - order.quantity() >= 0) {
int amount = reserved + order.getQuantity();
reservedStore.put(order.product(), amount);
pass();
} else {
fail()
}
…
}
48. 48
Validate and update State Store
public KeyValue transform(…) {…
Long reserved = reservedStore.get(order.getProduct());
if (inWarehouse - reserved - order.quantity() >= 0) {
int amount = reserved + order.getQuantity();
reservedStore.put(order.product(), amount);
pass();
} else {
fail()
}
…
}
52. 52
Rekey does two things in this case
- Collocate data that must join
- Serially execute critical section
against single data.
53. 53
Instance 1 Instance 2
Partitioned by ProductId
Everything “iPad” Everything “iWatch”
Rekey: Collocates data that must join
JOIN JOIN
54. 54
Instance 1 Instance 2
Partitioned by ProductId
Everything “iPad” Everything “iWatch”
- Rekey: Serially execute critical section against
single data.
CaS CaS
57. 57
Fraud Service
CREATE STREAM OrderValidations AS
SELECT userId, sum(amount)
FROM Orders
WINDOW TUMBLING(SIZE 60 MINUTE)
GROUP BY userId
HAVING sum(amount) > 10000;
61. 61
Gotchas/Guidelines
- Use Schemas (Schema registry)
- Global KTables & KTables are subtly different on replay.
- Stream-table joins only join one way
- The defaults aren’t enough. See resiliency settings in the
documentation.
- Releasing
- Change application id trick:
- loses committed offsets
- Doesn’t delete topics, leaves them hanging
- Name state store changelog topics
- Start simple (Stateless)