# Groups
`kafkit-client` supports two Kafka group styles:
- Modern consumer groups for partition-owned stream processing.
- Share groups for work-queue style record sharing.
Classic consumer group runtime membership is not implemented. The admin client
can list, describe, and delete classic groups.
## Modern Consumer Groups
Use modern consumer groups for normal Kafka consumption where each partition is
owned by one group member at a time.
Properties:
- Partition ordering is preserved for the assigned member.
- Membership and heartbeats use the modern Kafka group protocol.
- Topic-list and regex subscriptions participate in group assignment.
- Manual assignment is available when group membership is not needed.
- Existing committed offsets remain normal Kafka committed offsets.
```rust,no_run
use kafkit_client::{AutoOffsetReset, KafkaClient};
#[tokio::main]
async fn main() -> kafkit_client::Result<()> {
let consumer = KafkaClient::new("localhost:9092")
.topics(["orders", "payments"])
.consumer("orders-reader")
.with_auto_offset_reset(AutoOffsetReset::Earliest)
.connect()
.await?;
let records = consumer.poll().await?;
consumer.commit(&records).await?;
consumer.shutdown().await?;
Ok(())
}
```
## Share Groups
Use share groups for work-queue style processing where multiple members can
share records from the same partitions. Records are acquired, processed, then
acknowledged.
```rust,no_run
use kafkit_client::{AcknowledgeType, ConsumerConfig, KafkaShareConsumer};
#[tokio::main]
async fn main() -> kafkit_client::Result<()> {
let mut consumer =
KafkaShareConsumer::connect(ConsumerConfig::new("localhost:9092", "orders-share")).await?;
consumer.subscribe(vec!["orders".to_owned()]).await?;
let records = consumer.poll().await?;
for record in records.iter() {
println!("delivery count: {}", record.delivery_count);
consumer.acknowledge(record, AcknowledgeType::Accept);
}
consumer.commit_sync().await?;
consumer.shutdown().await?;
Ok(())
}
```
Acknowledgement types:
- `Accept` marks a record as successfully processed.
- `Release` makes a record available for redelivery.
- `Reject` rejects a record.
## Choosing A Group Type
- Choose a modern consumer group for partition-ordered stream processing.
- Choose a share group for distributed task processing.
- Choose manual assignment for direct partition control without group
coordination.
- Upgrade classic-group-only clusters before adopting `kafkit-client`
consumers.