{"id":926,"date":"2026-04-17T04:02:34","date_gmt":"2026-04-17T04:02:34","guid":{"rendered":"https:\/\/www.devopsschool.com\/tutorials\/oracle-cloud-streaming-tutorial-architecture-pricing-use-cases-and-hands-on-guide-for-integration\/"},"modified":"2026-04-17T04:02:34","modified_gmt":"2026-04-17T04:02:34","slug":"oracle-cloud-streaming-tutorial-architecture-pricing-use-cases-and-hands-on-guide-for-integration","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/tutorials\/oracle-cloud-streaming-tutorial-architecture-pricing-use-cases-and-hands-on-guide-for-integration\/","title":{"rendered":"Oracle Cloud Streaming Tutorial: Architecture, Pricing, Use Cases, and Hands-On Guide for Integration"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Category<\/h2>\n\n\n\n<p>Integration<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Introduction<\/h2>\n\n\n\n<p>Oracle Cloud <strong>Streaming<\/strong> (commonly referred to as <strong>OCI Streaming<\/strong>) is Oracle Cloud Infrastructure\u2019s managed event streaming service in the <strong>Integration<\/strong> category. It\u2019s designed to move continuous flows of data (\u201cevents\u201d) from producers (apps, services, devices) to consumers (analytics, microservices, data platforms) in a decoupled, scalable way.<\/p>\n\n\n\n<p>In simple terms: <strong>Streaming is a managed \u201cpipe\u201d for events<\/strong>. Producers write messages into a stream, and one or more consumer applications read those messages independently, at their own pace, without tightly coupling systems together.<\/p>\n\n\n\n<p>Technically, Streaming provides <strong>durable, partitioned, ordered logs of messages<\/strong> with configurable retention. It exposes APIs and tooling suitable for event-driven architectures, real-time data pipelines, and microservices integration. Oracle Cloud positions Streaming alongside other Integration services such as Service Connector Hub and Events to help you build reliable, loosely coupled systems.<\/p>\n\n\n\n<p>The problem it solves: <strong>reliable, scalable, near-real-time data distribution<\/strong> across systems\u2014without building and operating your own streaming cluster infrastructure.<\/p>\n\n\n\n<blockquote>\n<p>Service name note: As of this writing, the official Oracle Cloud Infrastructure service name remains <strong>Streaming<\/strong> in the console and documentation. It is not the same as Apache Kafka (open source) or similarly named services in other clouds. OCI Streaming does provide Kafka-related interoperability options, but it is its own managed OCI service. Always verify the latest capabilities in the official docs.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">2. What is Streaming?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Official purpose<\/h3>\n\n\n\n<p>Oracle Cloud <strong>Streaming<\/strong> is a managed service for publishing and consuming continuous streams of data (messages\/events). It\u2019s intended for <strong>event streaming<\/strong>, <strong>log streaming<\/strong>, and <strong>real-time integration<\/strong> patterns where many producers and consumers need to exchange data reliably.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Core capabilities<\/h3>\n\n\n\n<p>At a high level, Streaming provides:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Streams<\/strong> to hold messages (events) for a defined retention period.<\/li>\n<li><strong>Partitions<\/strong> within a stream to scale throughput and preserve ordering within each partition.<\/li>\n<li><strong>Producers<\/strong> that publish messages to a stream.<\/li>\n<li><strong>Consumers<\/strong> that read messages from a stream, typically using <strong>cursors<\/strong> and consumer coordination patterns (for example, consumer groups).<\/li>\n<li><strong>Durability<\/strong> during the retention window and the ability for consumers to replay data by reading from earlier offsets (subject to retention).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Major components (conceptual model)<\/h3>\n\n\n\n<p>Common OCI Streaming concepts you will see in the console and APIs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Stream Pool<\/strong>: A grouping construct for streams (and related configuration\/limits). Many OCI Streaming operations are scoped to a stream pool.<\/li>\n<li><strong>Stream<\/strong>: The named log where messages are written and retained.<\/li>\n<li><strong>Partitions<\/strong>: Shards that allow parallelism and ordering guarantees (ordering is within a partition).<\/li>\n<li><strong>Messages<\/strong>: Records written by producers (often JSON, Avro, Protobuf, or plain text).<\/li>\n<li><strong>Cursors \/ Offsets<\/strong>: Positions that consumers use to read messages.<\/li>\n<li><strong>Consumer coordination<\/strong>: Patterns for scaling consumers safely. (Exact mechanisms depend on the API you use; verify current support in official docs.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Service type<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Managed streaming service<\/strong> (PaaS-like experience on OCI).<\/li>\n<li>Fits within the <strong>Integration<\/strong> category because it integrates apps and services through events.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Scope (regional\/global and tenancy scoping)<\/h3>\n\n\n\n<p>OCI Streaming is generally <strong>regional<\/strong>: you create stream pools and streams in a specific <strong>OCI region<\/strong> inside a <strong>tenancy<\/strong> and <strong>compartment<\/strong>. You control access via IAM policies at the compartment level.<\/p>\n\n\n\n<blockquote>\n<p>Exact regional availability and any per-region feature differences must be verified in official OCI docs and region service availability pages.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">How it fits into the Oracle Cloud ecosystem<\/h3>\n\n\n\n<p>Streaming is commonly used with:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Service Connector Hub<\/strong> to move data between Streaming and OCI services (for example, Logging, Object Storage, Monitoring targets, or other supported sinks\/sources). Verify exact connector types in your region.<\/li>\n<li><strong>Functions<\/strong> and <strong>OKE (Oracle Kubernetes Engine)<\/strong> for event-driven compute.<\/li>\n<li><strong>API Gateway<\/strong> for ingestion endpoints.<\/li>\n<li><strong>Autonomous Database \/ Oracle Database<\/strong> and data platforms for analytics pipelines (often via connectors, custom consumers, or ETL tools).<\/li>\n<li><strong>IAM, Vault, Logging, Monitoring, Audit<\/strong> for security and operations.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">3. Why use Streaming?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Business reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Faster time-to-integration<\/strong>: teams can integrate systems via events rather than point-to-point coupling.<\/li>\n<li><strong>Real-time insights<\/strong>: unlock near-real-time analytics and alerting.<\/li>\n<li><strong>Reduced operational burden<\/strong>: avoid operating your own streaming cluster (patching, scaling, fault handling).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Technical reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Decoupling<\/strong>: producers and consumers evolve independently.<\/li>\n<li><strong>Replayability<\/strong>: consumers can reprocess events (within retention).<\/li>\n<li><strong>Scalability<\/strong>: partitions allow parallel consumers and higher throughput.<\/li>\n<li><strong>Backpressure tolerance<\/strong>: consumers can fall behind temporarily without losing data (within retention).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Operational reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Managed service<\/strong>: provisioning and service-level maintenance is handled by Oracle.<\/li>\n<li><strong>Centralized governance<\/strong>: compartments, IAM policies, tags, audit trails.<\/li>\n<li><strong>Monitoring integration<\/strong>: service metrics and logs can be tied into OCI observability.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Security \/ compliance reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>IAM-based access<\/strong>: fine-grained policies per compartment.<\/li>\n<li><strong>Encryption<\/strong>: transport security (TLS) and encryption at rest are typically expected for managed services (verify Streaming\u2019s exact encryption features and key management options in your region).<\/li>\n<li><strong>Auditability<\/strong>: OCI Audit records control-plane operations.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Scalability \/ performance reasons<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Partitioned streaming<\/strong>: scale ingest and consume with partitions.<\/li>\n<li><strong>Multiple independent consumer applications<\/strong>: each consumer can have its own read position.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">When teams should choose Streaming<\/h3>\n\n\n\n<p>Choose Streaming when you need:\n&#8211; Event-driven microservices communication.\n&#8211; Real-time pipelines (logs, telemetry, clickstreams).\n&#8211; A durable buffer between systems.\n&#8211; Multiple consumers reading the same event flow independently.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">When teams should not choose it<\/h3>\n\n\n\n<p>Avoid (or reconsider) Streaming if:\n&#8211; You only need simple point-to-point messaging with low volume and no replay; <strong>OCI Queue<\/strong> or direct service integration may be simpler (verify which messaging services you have enabled and their fit).\n&#8211; You need strict <strong>exactly-once<\/strong> processing end-to-end without building idempotency and transactional patterns yourself.\n&#8211; Your workload is batch-only with no real-time requirement; Object Storage + scheduled processing may be cheaper and simpler.\n&#8211; Your data must remain within a very specific network boundary and Streaming cannot meet that boundary in your region (verify private endpoint options and networking constraints).<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Where is Streaming used?<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Industries<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>E-commerce \/ retail<\/strong>: clickstream, cart events, inventory updates<\/li>\n<li><strong>Financial services<\/strong>: fraud signals, trade events, risk telemetry<\/li>\n<li><strong>Telecom<\/strong>: network telemetry, near-real-time monitoring<\/li>\n<li><strong>Media<\/strong>: user activity events, content engagement analytics<\/li>\n<li><strong>Manufacturing \/ IoT<\/strong>: sensor telemetry, equipment health<\/li>\n<li><strong>SaaS<\/strong>: audit events, product analytics, webhook fan-out<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Team types<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Platform engineering teams building shared event backbones<\/li>\n<li>Data engineering teams building streaming ingestion pipelines<\/li>\n<li>Microservice teams implementing asynchronous integration<\/li>\n<li>SRE\/operations teams standardizing telemetry flows<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Workloads<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Real-time event ingestion and distribution<\/li>\n<li>Stream processing (with custom consumers or external stream processing frameworks)<\/li>\n<li>Log aggregation and forwarding (when integrated with logging pipelines)<\/li>\n<li>Near-real-time anomaly detection<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Architectures<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Event-driven microservices<\/li>\n<li>CQRS \/ event sourcing (with careful design and governance)<\/li>\n<li>Fan-out pipelines: one producer, many consumers<\/li>\n<li>Multi-stage pipelines: raw events \u2192 enriched events \u2192 analytics<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Real-world deployment contexts<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Production<\/strong>: stable streams with defined schemas, retention, IAM controls, and observability.<\/li>\n<li><strong>Dev\/Test<\/strong>: ephemeral streams and smaller partition counts; careful cleanup to control cost.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">5. Top Use Cases and Scenarios<\/h2>\n\n\n\n<p>Below are realistic, production-style scenarios where Oracle Cloud Streaming fits well.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1) Microservices event bus<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Synchronous service calls cause cascading failures and tight coupling.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Services can publish domain events and consumers handle them asynchronously.<\/li>\n<li><strong>Example<\/strong>: <code>OrderService<\/code> publishes <code>OrderCreated<\/code>; <code>BillingService<\/code>, <code>ShippingService<\/code>, and <code>EmailService<\/code> consume independently.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2) Centralized application audit\/event pipeline<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Audit events are scattered across services and hard to analyze.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Standardize audit events into streams; downstream consumers send to storage\/SIEM.<\/li>\n<li><strong>Example<\/strong>: All apps publish <code>UserLoggedIn<\/code>, <code>PermissionChanged<\/code> to Streaming; a consumer forwards to Object Storage.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3) Clickstream analytics ingestion<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: High-volume user interaction events must be captured reliably.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Handles continuous ingestion; consumers can enrich and load to analytics stores.<\/li>\n<li><strong>Example<\/strong>: Web\/mobile events published to <code>clickstream<\/code> stream; consumer aggregates session metrics.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4) IoT telemetry buffer and router<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Devices send telemetry bursts; downstream processing cannot keep up.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Streaming buffers bursts; consumers scale horizontally.<\/li>\n<li><strong>Example<\/strong>: Factory sensors publish temperature and vibration events; consumers detect anomalies.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5) Log shipping \/ near-real-time observability pipeline<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: You need to route logs\/metrics to multiple destinations.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Use Streaming as a durable buffer; consumers forward to different systems.<\/li>\n<li><strong>Example<\/strong>: A log forwarder publishes to Streaming; one consumer indexes to search, another stores to Object Storage.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6) Event-driven data lake ingestion<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Data lake ingestion from many producers needs decoupling and replay.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Durable retention plus replay supports late consumers and reprocessing.<\/li>\n<li><strong>Example<\/strong>: Producers publish <code>transactions<\/code> events; a connector\/consumer writes partitioned files to Object Storage.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7) Fraud detection signals pipeline<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Fraud models need real-time features from many sources.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Aggregate signals in a stream; consumers compute features and trigger actions.<\/li>\n<li><strong>Example<\/strong>: Payment events + login events enter Streaming; consumer flags suspicious patterns.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">8) Database change propagation (CDC-style integration)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Downstream systems need to react to changes in operational databases.<\/li>\n<li><strong>Why Streaming fits<\/strong>: With CDC tooling (external or custom), change events can be published and consumed reliably.<\/li>\n<li><strong>Example<\/strong>: A CDC agent publishes row-change events to Streaming; consumers update search indexes.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">9) Asynchronous workflow orchestration<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Multi-step processes fail when steps are tightly coupled.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Each stage consumes events, performs work, emits next-stage events.<\/li>\n<li><strong>Example<\/strong>: <code>document.uploaded<\/code> \u2192 <code>document.virus_scanned<\/code> \u2192 <code>document.indexed<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">10) Multi-tenant SaaS event isolation (by stream or key)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Multi-tenant events must be isolated and governed.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Separate streams per tenant, or partition by tenant key with strict access and schema controls.<\/li>\n<li><strong>Example<\/strong>: Tenant A events go to <code>tenantA-events<\/code> stream with IAM policies.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">11) Cache invalidation\/event-driven consistency<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Stale caches lead to incorrect reads.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Publish invalidation events; consumers invalidate caches across services.<\/li>\n<li><strong>Example<\/strong>: Product update triggers <code>ProductUpdated<\/code> events; cache services consume and purge keys.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">12) CI\/CD telemetry and deployment events<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: Deployment and pipeline events need centralized tracking.<\/li>\n<li><strong>Why Streaming fits<\/strong>: Stream pipeline events; consumers build dashboards and alerts.<\/li>\n<li><strong>Example<\/strong>: Build systems publish <code>build_started<\/code>, <code>deploy_succeeded<\/code> events to Streaming.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">6. Core Features<\/h2>\n\n\n\n<blockquote>\n<p>Note: Oracle Cloud services evolve. For any feature that is region-dependent or periodically updated, validate in the official documentation.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">1) Stream pools and streams<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Lets you group and manage streams under a stream pool.<\/li>\n<li><strong>Why it matters<\/strong>: Helps with governance, limits, and operational grouping.<\/li>\n<li><strong>Practical benefit<\/strong>: Organize environments (dev\/test\/prod) and teams by compartments\/pools.<\/li>\n<li><strong>Caveats<\/strong>: Limits (number of streams, partitions, throughput) apply; verify service limits for your tenancy\/region.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">2) Partitioned data model with ordering per partition<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Messages in a stream are distributed across partitions; ordering is preserved <strong>within<\/strong> a partition.<\/li>\n<li><strong>Why it matters<\/strong>: Enables parallelism and higher throughput.<\/li>\n<li><strong>Practical benefit<\/strong>: Scale consumers horizontally by partition.<\/li>\n<li><strong>Caveats<\/strong>: No global ordering across partitions; design keys carefully.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">3) Message retention and replay (time\/offset-based consumption)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Retains messages for a configured period; consumers can read from earlier offsets (within retention).<\/li>\n<li><strong>Why it matters<\/strong>: Enables reprocessing and recovery.<\/li>\n<li><strong>Practical benefit<\/strong>: Rebuild downstream materialized views or re-run analytics.<\/li>\n<li><strong>Caveats<\/strong>: Retention has maximum limits; storage\/retention can affect cost. Verify maximum retention and storage behavior.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4) Producer APIs for publishing messages<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Applications publish messages to a stream.<\/li>\n<li><strong>Why it matters<\/strong>: Foundation for event-driven design.<\/li>\n<li><strong>Practical benefit<\/strong>: Decouples ingestion from processing.<\/li>\n<li><strong>Caveats<\/strong>: Message size limits apply; batching improves throughput; retries must be handled carefully to avoid duplicates.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">5) Consumer APIs with cursor management<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Consumers create cursors to start reading from a point (latest, from beginning, at time, at offset) and then fetch messages.<\/li>\n<li><strong>Why it matters<\/strong>: Enables controlled reads and replay.<\/li>\n<li><strong>Practical benefit<\/strong>: Start new consumers without impacting producers.<\/li>\n<li><strong>Caveats<\/strong>: Consumers must manage cursor state (or use a client that does). Cursor semantics vary by API; verify details.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">6) Kafka interoperability (where supported)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: OCI Streaming is commonly used with Kafka tooling via a Kafka-compatible endpoint\/API (capabilities vary).<\/li>\n<li><strong>Why it matters<\/strong>: Reuse existing Kafka ecosystem clients and operational patterns.<\/li>\n<li><strong>Practical benefit<\/strong>: Faster adoption for teams experienced with Kafka.<\/li>\n<li><strong>Caveats<\/strong>: Not all Kafka features are necessarily supported. Validate supported Kafka protocol versions, authentication mechanisms, and feature parity in official docs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">7) IAM-based authentication and authorization<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Uses OCI IAM policies to control who can manage and access Streaming resources.<\/li>\n<li><strong>Why it matters<\/strong>: Central governance and least privilege.<\/li>\n<li><strong>Practical benefit<\/strong>: Control access by compartment, groups, dynamic groups, and automation identities.<\/li>\n<li><strong>Caveats<\/strong>: Policies can be subtle; misconfiguration can block producers\/consumers or over-grant access.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">8) Encryption in transit and at rest (verify exact details)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Uses secure transport (TLS) and encryption at rest typical of managed services.<\/li>\n<li><strong>Why it matters<\/strong>: Protects data confidentiality and compliance posture.<\/li>\n<li><strong>Practical benefit<\/strong>: Reduced burden for security controls.<\/li>\n<li><strong>Caveats<\/strong>: Customer-managed keys (CMK) support and configuration details may be region\/feature dependent\u2014verify.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">9) Monitoring metrics and service observability<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Exposes service metrics (for throughput, errors, etc.) through OCI Monitoring.<\/li>\n<li><strong>Why it matters<\/strong>: You need visibility to scale partitions, identify throttling, and detect consumer lag patterns.<\/li>\n<li><strong>Practical benefit<\/strong>: Create alarms and dashboards for production.<\/li>\n<li><strong>Caveats<\/strong>: Some lag metrics may be client-side; confirm what is available from the service.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">10) Integration with OCI Integration and data movement services<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>What it does<\/strong>: Works with Integration services such as Service Connector Hub to move data between services.<\/li>\n<li><strong>Why it matters<\/strong>: Reduces custom glue code.<\/li>\n<li><strong>Practical benefit<\/strong>: Stream \u2192 Object Storage archive; Stream \u2192 Logging; etc. (verify exact connectors).<\/li>\n<li><strong>Caveats<\/strong>: Connector availability and supported sources\/targets vary; verify in your region.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Architecture and How It Works<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">High-level service architecture<\/h3>\n\n\n\n<p>At a conceptual level:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Producers<\/strong> send records to a <strong>Stream<\/strong>.<\/li>\n<li>The Stream stores records in <strong>Partitions<\/strong> for the duration of the retention period.<\/li>\n<li><strong>Consumers<\/strong> read records by creating a <strong>Cursor<\/strong> (or using Kafka consumer semantics when using Kafka compatibility).<\/li>\n<li>Consumers may commit offsets (depending on client API), transform data, and push results to downstream systems.<\/li>\n<\/ol>\n\n\n\n<p>Streaming has both:\n&#8211; <strong>Control plane<\/strong>: create\/manage stream pools, streams, IAM policies.\n&#8211; <strong>Data plane<\/strong>: publish\/consume messages.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Request\/data\/control flow<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Control plane operations<\/strong>: Usually performed by console\/CLI\/SDK and governed by IAM.<\/li>\n<li><strong>Data plane operations<\/strong>: Producers\/consumers connect to Streaming endpoints to put\/get messages.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Common integrations in OCI<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Service Connector Hub<\/strong>: move data from Streaming to sinks like Object Storage or Logging (verify available sinks).<\/li>\n<li><strong>Functions<\/strong>: event-driven processing by consuming from Streaming (often via custom consumer code or connectors).<\/li>\n<li><strong>OKE<\/strong>: run scalable consumers\/producers.<\/li>\n<li><strong>Logging \/ Monitoring \/ Alarm<\/strong>: operational insight and alerting.<\/li>\n<li><strong>Vault<\/strong>: secrets (API keys, auth tokens) management; also possibly encryption key management (verify).<\/li>\n<li><strong>API Gateway<\/strong>: build ingestion endpoints to publish into Streaming (commonly via a producer service behind the gateway).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Dependency services<\/h3>\n\n\n\n<p>Typical dependencies you\u2019ll use in real deployments:\n&#8211; <strong>IAM<\/strong>: policies, groups, dynamic groups.\n&#8211; <strong>Networking (VCN)<\/strong>: if using private access patterns (verify private endpoint support).\n&#8211; <strong>Vault<\/strong>: secret storage.\n&#8211; <strong>Monitoring\/Logging\/Audit<\/strong>: observability and governance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Security\/authentication model<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OCI services are governed by <strong>IAM policies<\/strong> scoped to compartments.<\/li>\n<li>Applications commonly authenticate using:<\/li>\n<li>OCI SDK authentication (API keys, instance principals, resource principals) depending on runtime.<\/li>\n<li>Kafka authentication methods when using Kafka compatibility (often using an auth token + TLS; verify current docs).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Networking model<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Producers\/consumers connect to a Streaming endpoint in the region.<\/li>\n<li>You must plan:<\/li>\n<li>Public internet access vs private connectivity.<\/li>\n<li>VCN egress controls, NAT, service gateways, or private endpoints (feature availability varies; verify).<\/li>\n<li>Cross-region ingestion\/consumption implies latency and potential data transfer costs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Monitoring\/logging\/governance considerations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use compartments, tags, and naming standards.<\/li>\n<li>Monitor:<\/li>\n<li>publish\/consume throughput<\/li>\n<li>error rates\/throttling<\/li>\n<li>consumer lag patterns (where measurable)<\/li>\n<li>Use Audit for change tracking on streams and policies.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Simple architecture diagram (Mermaid)<\/h3>\n\n\n\n<pre><code class=\"language-mermaid\">flowchart LR\n  P1[Producer App] --&gt; S[(OCI Streaming\\nStream)]\n  P2[Producer Service] --&gt; S\n  S --&gt; C1[Consumer: Enricher]\n  S --&gt; C2[Consumer: Analytics Loader]\n  S --&gt; C3[Consumer: Alerting Service]\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Production-style architecture diagram (Mermaid)<\/h3>\n\n\n\n<pre><code class=\"language-mermaid\">flowchart TB\n  subgraph VCN[VCN (App Network)]\n    OKE[OKE Cluster\\n(Producers\/Consumers)]\n    FN[OCI Functions\\n(Event Processing)]\n    APIGW[API Gateway]\n  end\n\n  subgraph OCI[Oracle Cloud (Region)]\n    STR[OCI Streaming\\n(Stream Pool + Streams)]\n    SCH[Service Connector Hub]\n    OBJ[Object Storage\\n(Archive \/ Data Lake Landing)]\n    LOG[Logging]\n    MON[Monitoring + Alarms]\n    VAULT[Vault\\n(Secrets\/Keys)]\n    AUD[Audit]\n    ADB[Autonomous Database\\n(Downstream)]\n  end\n\n  APIGW --&gt; OKE\n  OKE --&gt; STR\n  FN --&gt; STR\n  STR --&gt; OKE\n  STR --&gt; SCH\n  SCH --&gt; OBJ\n  SCH --&gt; LOG\n  OKE --&gt; ADB\n\n  STR --&gt; MON\n  STR --&gt; AUD\n  OKE --&gt; VAULT\n  FN --&gt; VAULT\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">8. Prerequisites<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Account\/tenancy requirements<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An <strong>Oracle Cloud Infrastructure tenancy<\/strong> with permission to create and manage Streaming resources.<\/li>\n<li>A <strong>compartment<\/strong> where you will create:<\/li>\n<li>stream pool<\/li>\n<li>streams<\/li>\n<li>IAM policies (or access via existing policies)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Permissions \/ IAM roles<\/h3>\n\n\n\n<p>You need IAM policies that allow you to:\n&#8211; Manage stream pools\/streams (admin tasks)\n&#8211; Publish and consume messages (data plane tasks)<\/p>\n\n\n\n<p>OCI policies are expressed in OCI policy language. Exact verbs\/resource-types can vary by service and have changed over time. <strong>Use the official Streaming IAM policy reference<\/strong> and start with least privilege.<\/p>\n\n\n\n<blockquote>\n<p>Verify in official docs: the exact policy statements for stream pools, streams, and message access (data plane) can differ.<\/p>\n<\/blockquote>\n\n\n\n<p>A common approach is:\n&#8211; Put Streaming resources in a compartment (e.g., <code>streaming-dev<\/code>).\n&#8211; Create a group (e.g., <code>streaming-developers<\/code>).\n&#8211; Create policies granting that group appropriate access in that compartment.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Billing requirements<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Streaming is a billable OCI service (with possible free tier\/always free constraints depending on region and account).<br\/>\n<strong>Verify Always Free eligibility<\/strong> for Streaming in the official Free Tier documentation.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Tools needed<\/h3>\n\n\n\n<p>For the hands-on lab in this tutorial:\n&#8211; OCI Console access\n&#8211; Python 3.9+ (3.11+ recommended)\n&#8211; <code>pip<\/code> package manager\n&#8211; OCI Python SDK (<code>oci<\/code>)\n&#8211; OCI config file (API key) <strong>or<\/strong> a compute runtime that supports <strong>Instance Principals<\/strong> (optional alternative)<\/p>\n\n\n\n<p>Optional:\n&#8211; OCI CLI (helpful for listing OCIDs and automation)\n&#8211; Kafka clients (only if you want to test Kafka compatibility; not required for this lab)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Region availability<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Streaming is not available in every region and some features are region-limited.<br\/>\n  Check:<\/li>\n<li>OCI Region availability: https:\/\/www.oracle.com\/cloud\/public-cloud-regions\/<\/li>\n<li>Streaming documentation and service limits for your region.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Quotas\/limits<\/h3>\n\n\n\n<p>Expect limits such as:\n&#8211; number of stream pools per tenancy\/compartment\n&#8211; number of streams per pool\n&#8211; partitions per stream\n&#8211; throughput constraints\n&#8211; retention limits<\/p>\n\n\n\n<p>You can review and request limit increases in OCI (Service Limits). Exact names vary; verify in console under <strong>Governance &amp; Administration \u2192 Limits, Quotas and Usage<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Prerequisite services<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IAM (users\/groups\/policies)<\/li>\n<li>(Recommended) Vault for secrets if deploying producers\/consumers in production<\/li>\n<li>Monitoring\/Logging for observability<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">9. Pricing \/ Cost<\/h2>\n\n\n\n<blockquote>\n<p>This section explains the <strong>pricing model<\/strong> and cost drivers without inventing region-specific numbers. Always confirm current pricing in the official price list and calculator.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Official pricing references<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OCI Pricing overview: https:\/\/www.oracle.com\/cloud\/pricing\/<\/li>\n<li>OCI Cost Estimator: https:\/\/www.oracle.com\/cloud\/costestimator.html<\/li>\n<li>OCI price list (navigate to Integration\/Streaming): https:\/\/www.oracle.com\/cloud\/price-list\/<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Pricing dimensions (how Streaming is typically billed)<\/h3>\n\n\n\n<p>OCI Streaming pricing is <strong>usage-based<\/strong>. Common billing dimensions for managed streaming services (and often applicable to OCI Streaming) include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Provisioned capacity \/ throughput units<\/strong> (for ingestion and egress)<\/li>\n<li><strong>Partition count<\/strong> or a unit derived from partitions and throughput<\/li>\n<li><strong>Data retention\/storage<\/strong> during the retention window<\/li>\n<li><strong>Data transfer<\/strong> (especially cross-region or egress to internet)<\/li>\n<li><strong>Requests\/API operations<\/strong> in some services (verify if Streaming prices per request or per throughput unit in your region)<\/li>\n<\/ul>\n\n\n\n<p>Because Oracle pricing pages can change, and because some services use multiple SKUs, treat the above as the model to validate\u2014not guaranteed specifics. <strong>Verify the exact meters for OCI Streaming on the official price list.<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Free tier<\/h3>\n\n\n\n<p>Oracle Cloud offers a Free Tier program, and some services include Always Free resources. <strong>Do not assume Streaming is Always Free<\/strong> in all regions\/tenancies. Check:\n&#8211; Free Tier: https:\/\/www.oracle.com\/cloud\/free\/<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Key cost drivers<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Throughput and partitioning<\/strong>\n   &#8211; More partitions or higher throughput provisioning typically increases cost.<\/li>\n<li><strong>Retention<\/strong>\n   &#8211; Longer retention usually means more storage.<\/li>\n<li><strong>Consumer fan-out<\/strong>\n   &#8211; Many consumers reading the same data increases <strong>egress<\/strong> from the service and downstream processing cost.<\/li>\n<li><strong>Cross-region and internet egress<\/strong>\n   &#8211; Pulling data across regions or out to the internet can add network charges.<\/li>\n<li><strong>Downstream services<\/strong>\n   &#8211; Object Storage, databases, OKE compute, Functions invocations, and logging all have their own cost models.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Hidden\/indirect costs to watch<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OKE worker nodes<\/strong> for consumers (compute + storage).<\/li>\n<li><strong>NAT Gateway<\/strong> data processing charges if using private subnets with internet egress.<\/li>\n<li><strong>Logging ingestion<\/strong> if you route streaming data into logs.<\/li>\n<li><strong>Observability<\/strong>: high-cardinality metrics and logs can become costly.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Network\/data transfer implications<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Same-region traffic between OCI services may be cheaper than cross-region.<\/li>\n<li>Cross-region replication or consumers in a different region can incur egress.<\/li>\n<li>Internet egress to on-prem or external clouds can be a major driver.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cost optimization strategies<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Right-size partitions: use enough for throughput and parallelism, not \u201cone per team member.\u201d<\/li>\n<li>Use batching for producers to reduce overhead and improve throughput efficiency.<\/li>\n<li>Limit retention to what you truly need for replay\/recovery.<\/li>\n<li>Prefer same-region consumers when possible.<\/li>\n<li>If archiving, consider writing to Object Storage and expiring data based on lifecycle policies rather than long streaming retention.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Example low-cost starter estimate (non-numeric)<\/h3>\n\n\n\n<p>A low-cost dev setup often looks like:\n&#8211; 1 stream pool (dev)\n&#8211; 1 stream with a small number of partitions\n&#8211; Short retention\n&#8211; One producer and one consumer running locally for tests<\/p>\n\n\n\n<p>Use the <strong>OCI Cost Estimator<\/strong> with:\n&#8211; your region\n&#8211; expected throughput\n&#8211; partitions\n&#8211; retention<br\/>\nto get an accurate number.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example production cost considerations (non-numeric)<\/h3>\n\n\n\n<p>Production cost is often driven by:\n&#8211; peak ingest (MB\/s) and sustained throughput\n&#8211; multiple consumer groups (fan-out)\n&#8211; retention needs for replay (hours vs days)\n&#8211; HA and deployment topology (OKE replicas, multi-AZ design patterns where applicable)<\/p>\n\n\n\n<p>Build a cost model that ties business metrics to meters:\n&#8211; events\/sec \u00d7 avg event size \u00d7 retention hours \u00d7 number of consuming apps<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">10. Step-by-Step Hands-On Tutorial<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Objective<\/h3>\n\n\n\n<p>Create an Oracle Cloud <strong>Streaming<\/strong> stream, then <strong>produce and consume messages<\/strong> using the <strong>OCI Python SDK<\/strong>\u2014a practical, low-risk lab that teaches you the control plane (resource setup) and data plane (message flow).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lab Overview<\/h3>\n\n\n\n<p>You will:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a <strong>stream pool<\/strong> and a <strong>stream<\/strong> in the OCI Console.<\/li>\n<li>Configure local authentication for the OCI Python SDK.<\/li>\n<li>Run a <strong>producer<\/strong> script to publish messages.<\/li>\n<li>Run a <strong>consumer<\/strong> script to read messages from the stream.<\/li>\n<li>Validate results.<\/li>\n<li>Troubleshoot common issues.<\/li>\n<li>Clean up resources to avoid ongoing cost.<\/li>\n<\/ol>\n\n\n\n<blockquote>\n<p>This lab uses local API key auth via the standard OCI config file. In production, prefer <strong>Instance Principals<\/strong> (for compute instances) or <strong>Resource Principals<\/strong> (for Functions) to avoid long-lived user keys. Verify the recommended auth model for your runtime in OCI docs.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Create (or pick) a compartment for the lab<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In the OCI Console, go to <strong>Identity &amp; Security \u2192 Compartments<\/strong>.<\/li>\n<li>Create a compartment such as <code>integration-streaming-lab<\/code> (or reuse an existing dev compartment).<\/li>\n<li>Note the compartment OCID (optional; helpful later).<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> You have a compartment where you can create Streaming resources.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Ensure you have permissions (IAM policy)<\/h3>\n\n\n\n<p>You need permissions to manage Streaming resources in your compartment.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\n<p>Decide whether you will use:\n   &#8211; your existing admin permissions, or\n   &#8211; a dedicated group (recommended in real orgs)<\/p>\n<\/li>\n<li>\n<p>If you are not an admin, ask your OCI admin to grant appropriate access to Streaming in the target compartment using the official policy reference.<\/p>\n<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> Your user can create a stream pool and stream in the compartment.<\/p>\n\n\n\n<p><strong>Verification:<\/strong> Try opening <strong>Integration \u2192 Streaming<\/strong> in the console and confirm you can access the \u201cCreate\u201d actions.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 3: Create a Stream Pool<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In the OCI Console, go to <strong>Integration \u2192 Streaming<\/strong>.<\/li>\n<li>Choose the correct <strong>region<\/strong> (top-right region selector).<\/li>\n<li>Select your compartment (<code>integration-streaming-lab<\/code>).<\/li>\n<li>Create a <strong>Stream Pool<\/strong>.\n   &#8211; Name: <code>lab-pool<\/code>\n   &#8211; Keep defaults unless you have a specific reason to change them.<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> A stream pool exists and is in an active\/available state.<\/p>\n\n\n\n<p><strong>Verification:<\/strong> Open the pool details and confirm its lifecycle state is Active (or equivalent).<\/p>\n\n\n\n<blockquote>\n<p>Note: UI labels can change. If you do not see \u201cStream Pool,\u201d search within the Streaming page for \u201cPool,\u201d or check the official getting started guide.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 4: Create a Stream<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>\n<p>Inside the stream pool, create a <strong>Stream<\/strong>.\n   &#8211; Name: <code>lab-stream<\/code>\n   &#8211; Partitions: choose a small number (often 1\u20132 for a lab)\n   &#8211; Retention: choose a short retention for a lab (if configurable)<\/p>\n<\/li>\n<li>\n<p>Open the stream details page and record:\n   &#8211; <strong>Stream OCID<\/strong>\n   &#8211; <strong>Messages endpoint<\/strong> \/ Streaming endpoint (data plane endpoint)<\/p>\n<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> Stream exists and is Active.<\/p>\n\n\n\n<p><strong>Verification:<\/strong> The stream details page shows the stream OCID and the endpoint information.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 5: Configure local OCI SDK authentication (API key)<\/h3>\n\n\n\n<p>If you already use OCI CLI\/SDK, you may already have <code>~\/.oci\/config<\/code>. If not:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>In OCI Console, go to <strong>Identity &amp; Security \u2192 Users \u2192 (your user) \u2192 API Keys<\/strong>.<\/li>\n<li>Add an API key:\n   &#8211; Generate a key pair (download private key)\n   &#8211; Upload the public key<\/li>\n<li>Create or update your OCI config file at:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Linux\/macOS: <code>~\/.oci\/config<\/code><\/li>\n<li>Windows: <code>%USERPROFILE%\\.oci\\config<\/code><\/li>\n<\/ul>\n\n\n\n<p>A typical <code>~\/.oci\/config<\/code> looks like this:<\/p>\n\n\n\n<pre><code class=\"language-ini\">[DEFAULT]\nuser=ocid1.user.oc1..exampleuniqueID\nfingerprint=12:34:56:78:90:ab:cd:ef:12:34:56:78:90:ab:cd:ef\ntenancy=ocid1.tenancy.oc1..exampleuniqueID\nregion=us-ashburn-1\nkey_file=\/home\/you\/.oci\/oci_api_key.pem\n<\/code><\/pre>\n\n\n\n<p><strong>Expected outcome:<\/strong> You can authenticate locally to OCI.<\/p>\n\n\n\n<p><strong>Verification:<\/strong> Install OCI CLI (optional) and run:<\/p>\n\n\n\n<pre><code class=\"language-bash\">oci os ns get\n<\/code><\/pre>\n\n\n\n<p>If it returns your Object Storage namespace, your config and key work.<\/p>\n\n\n\n<blockquote>\n<p>If you don\u2019t want to install the CLI, you can proceed and let the Python scripts validate auth.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 6: Set up a Python virtual environment and install OCI SDK<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create a folder for the lab:<\/li>\n<\/ol>\n\n\n\n<pre><code class=\"language-bash\">mkdir oci-streaming-lab\ncd oci-streaming-lab\n<\/code><\/pre>\n\n\n\n<ol class=\"wp-block-list\" start=\"2\">\n<li>Create a virtual environment and install the SDK:<\/li>\n<\/ol>\n\n\n\n<pre><code class=\"language-bash\">python3 -m venv .venv\nsource .venv\/bin\/activate\npip install --upgrade pip\npip install oci\n<\/code><\/pre>\n\n\n\n<p><strong>Expected outcome:<\/strong> Python environment with <code>oci<\/code> installed.<\/p>\n\n\n\n<p><strong>Verification:<\/strong><\/p>\n\n\n\n<pre><code class=\"language-bash\">python -c \"import oci; print(oci.__version__)\"\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 7: Create a producer script (publish messages)<\/h3>\n\n\n\n<p>Create <code>producer.py<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-python\">import os\nimport sys\nimport json\nimport time\nimport base64\n\nimport oci\nfrom oci.streaming import StreamClient\nfrom oci.streaming.models import PutMessagesDetails, PutMessagesDetailsEntry\n\ndef b64(s: str) -&gt; str:\n    return base64.b64encode(s.encode(\"utf-8\")).decode(\"utf-8\")\n\ndef main():\n    stream_ocid = os.environ.get(\"OCI_STREAM_OCID\")\n    endpoint = os.environ.get(\"OCI_STREAM_ENDPOINT\")  # e.g., https:\/\/cell-1.streaming.&lt;region&gt;.oci.oraclecloud.com\n    if not stream_ocid or not endpoint:\n        print(\"Set OCI_STREAM_OCID and OCI_STREAM_ENDPOINT environment variables.\")\n        sys.exit(2)\n\n    config = oci.config.from_file()  # uses ~\/.oci\/config [DEFAULT]\n    client = StreamClient(config, service_endpoint=endpoint)\n\n    # Publish a small batch of JSON messages\n    events = []\n    for i in range(5):\n        payload = {\n            \"eventType\": \"lab.message\",\n            \"sequence\": i,\n            \"ts\": int(time.time()),\n            \"message\": f\"hello from OCI Streaming ({i})\"\n        }\n        events.append(\n            PutMessagesDetailsEntry(\n                key=b64(\"lab-key\"),\n                value=b64(json.dumps(payload))\n            )\n        )\n\n    put_details = PutMessagesDetails(messages=events)\n    resp = client.put_messages(stream_ocid, put_details)\n\n    print(\"PutMessages response (entries):\")\n    for entry in resp.data.entries:\n        # entry has fields like error \/ offset depending on API response\n        print(entry)\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n\n\n\n<p>Set environment variables (replace with your values from Step 4):<\/p>\n\n\n\n<pre><code class=\"language-bash\">export OCI_STREAM_OCID=\"ocid1.stream.oc1..exampleuniqueID\"\nexport OCI_STREAM_ENDPOINT=\"https:\/\/cell-1.streaming.&lt;region&gt;.oci.oraclecloud.com\"\n<\/code><\/pre>\n\n\n\n<p>Run the producer:<\/p>\n\n\n\n<pre><code class=\"language-bash\">python producer.py\n<\/code><\/pre>\n\n\n\n<p><strong>Expected outcome:<\/strong> The script publishes 5 messages successfully.<\/p>\n\n\n\n<p><strong>Verification:<\/strong> The output should show entries without errors. If errors appear, note them for troubleshooting.<\/p>\n\n\n\n<blockquote>\n<p>Data format note: The Streaming REST API uses Base64-encoded message values. The SDK models often reflect that. If Oracle updates SDK behavior, verify the latest examples in the official SDK docs.<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 8: Create a consumer script (read messages)<\/h3>\n\n\n\n<p>Create <code>consumer.py<\/code>:<\/p>\n\n\n\n<pre><code class=\"language-python\">import os\nimport sys\nimport json\nimport time\nimport base64\n\nimport oci\nfrom oci.streaming import StreamClient\nfrom oci.streaming.models import CreateCursorDetails\n\ndef unb64(s: str) -&gt; str:\n    return base64.b64decode(s.encode(\"utf-8\")).decode(\"utf-8\")\n\ndef main():\n    stream_ocid = os.environ.get(\"OCI_STREAM_OCID\")\n    endpoint = os.environ.get(\"OCI_STREAM_ENDPOINT\")\n    if not stream_ocid or not endpoint:\n        print(\"Set OCI_STREAM_OCID and OCI_STREAM_ENDPOINT environment variables.\")\n        sys.exit(2)\n\n    config = oci.config.from_file()\n    client = StreamClient(config, service_endpoint=endpoint)\n\n    # Start reading from the beginning of retained data.\n    # Other cursor types exist (LATEST, AT_TIME, AT_OFFSET). Verify in official docs.\n    cursor_details = CreateCursorDetails(\n        type=\"TRIM_HORIZON\"\n    )\n    cursor = client.create_cursor(stream_ocid, cursor_details).data.value\n\n    print(\"Cursor created. Reading messages...\")\n\n    # Poll a few times\n    for _ in range(5):\n        resp = client.get_messages(stream_ocid, cursor, limit=10)\n        msgs = resp.data\n\n        if not msgs:\n            print(\"No messages yet. Sleeping...\")\n            time.sleep(1)\n            continue\n\n        for m in msgs:\n            try:\n                payload = json.loads(unb64(m.value))\n            except Exception:\n                payload = unb64(m.value)\n            print(f\"partition={m.partition} offset={m.offset} payload={payload}\")\n\n        # Use next-cursor returned in headers for the next call\n        cursor = resp.headers.get(\"opc-next-cursor\")\n        if not cursor:\n            print(\"No next cursor returned; stopping.\")\n            break\n\n        time.sleep(1)\n\nif __name__ == \"__main__\":\n    main()\n<\/code><\/pre>\n\n\n\n<p>Run the consumer:<\/p>\n\n\n\n<pre><code class=\"language-bash\">python consumer.py\n<\/code><\/pre>\n\n\n\n<p><strong>Expected outcome:<\/strong> The consumer prints the messages you produced, including offsets and partitions.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Step 9: (Optional) Prove replay works<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Run <code>consumer.py<\/code> once; it reads from <code>TRIM_HORIZON<\/code>.<\/li>\n<li>Run it again; it should replay (unless retention expired and\/or your cursor type changes).<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> You can re-read retained messages when starting from the beginning.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Validation<\/h3>\n\n\n\n<p>Use this checklist:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>[ ] Stream pool is Active<\/li>\n<li>[ ] Stream is Active<\/li>\n<li>[ ] Producer script returns entries without errors<\/li>\n<li>[ ] Consumer script prints the JSON payloads<\/li>\n<li>[ ] Offsets increase and partitions are present<\/li>\n<li>[ ] Replay works (within retention)<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Troubleshooting<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Error: \u201cNotAuthorizedOrNotFound\u201d (401\/404)<\/h4>\n\n\n\n<p>Common causes:\n&#8211; Wrong compartment\/region selected when you created the stream.\n&#8211; IAM policy missing permissions for Streaming.\n&#8211; Using the wrong stream OCID or endpoint.<\/p>\n\n\n\n<p>Fix:\n&#8211; Re-check region in the console and in <code>~\/.oci\/config<\/code>.\n&#8211; Re-copy stream OCID and endpoint from the stream details page.\n&#8211; Ask admin to confirm correct IAM policies for Streaming.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Error: SSL\/TLS \/ certificate issues<\/h4>\n\n\n\n<p>Common causes:\n&#8211; Corporate proxy intercepting TLS.\n&#8211; Old Python\/OpenSSL environment.<\/p>\n\n\n\n<p>Fix:\n&#8211; Test from a different network.\n&#8211; Update Python and cert store.\n&#8211; If behind a proxy, configure proxy settings appropriately.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Consumer shows \u201cNo messages yet\u201d<\/h4>\n\n\n\n<p>Common causes:\n&#8211; Producer failed (check producer output for errors).\n&#8211; Cursor type set to <code>LATEST<\/code> and no new messages arrived.\n&#8211; Reading from a partition with no messages (less likely unless keyed partitioning is uneven).<\/p>\n\n\n\n<p>Fix:\n&#8211; Re-run the producer.\n&#8211; Use <code>TRIM_HORIZON<\/code> cursor for initial validation.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Producer returns per-message errors<\/h4>\n\n\n\n<p>Common causes:\n&#8211; Message too large.\n&#8211; Invalid base64 encoding.\n&#8211; Stream limits\/throttling.<\/p>\n\n\n\n<p>Fix:\n&#8211; Send smaller messages.\n&#8211; Validate base64 encoding.\n&#8211; Reduce publish rate or increase partitions\/capacity (verify scaling approach in OCI docs).<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h3 class=\"wp-block-heading\">Cleanup<\/h3>\n\n\n\n<p>To avoid ongoing cost:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Delete the <strong>Stream<\/strong> (<code>lab-stream<\/code>).<\/li>\n<li>Delete the <strong>Stream Pool<\/strong> (<code>lab-pool<\/code>) if it\u2019s only for this lab.<\/li>\n<li>If you created dedicated IAM policies\/groups for the lab, remove them if no longer needed.<\/li>\n<li>(Optional) Remove local environment variables and delete the Python virtual environment folder.<\/li>\n<\/ol>\n\n\n\n<p><strong>Expected outcome:<\/strong> No Streaming resources remain in that compartment for the lab.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">11. Best Practices<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Architecture best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Design partitions intentionally<\/strong>:<\/li>\n<li>Use more partitions for higher throughput and parallel consumption.<\/li>\n<li>Use stable partition keys for ordered processing (e.g., <code>orderId<\/code>).<\/li>\n<li><strong>Keep events small and schema-driven<\/strong>:<\/li>\n<li>Favor compact JSON or schema-based formats (Avro\/Protobuf) when ecosystem tooling supports it.<\/li>\n<li><strong>Use Streaming as a backbone, not a database<\/strong>:<\/li>\n<li>Retention is not infinite; long-term storage belongs in Object Storage or a database.<\/li>\n<li><strong>Plan replay and reprocessing<\/strong>:<\/li>\n<li>Build consumers to be idempotent so replays don\u2019t corrupt downstream state.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">IAM\/security best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Least privilege<\/strong>: separate admin (create\/delete streams) from producer\/consumer permissions.<\/li>\n<li><strong>Use workload identities<\/strong> where possible:<\/li>\n<li>Instance Principals for compute instances<\/li>\n<li>Resource Principals for Functions<br\/>\n  (Verify your runtime\u2019s recommended auth approach.)<\/li>\n<li><strong>Separate environments<\/strong> by compartment (dev\/test\/prod) and enforce policies per environment.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Cost best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Keep retention short unless there\u2019s a clear replay requirement.<\/li>\n<li>Avoid unnecessary fan-out: each additional consumer group increases read traffic.<\/li>\n<li>Archive older data to Object Storage with lifecycle policies.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Performance best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Batch writes<\/strong> (multiple messages per call) to improve throughput.<\/li>\n<li>Use compression at the application layer if message size is a bottleneck (validate downstream requirements).<\/li>\n<li>Monitor throttling and scale partitions\/capacity before peak events.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Reliability best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use retry with backoff for transient errors.<\/li>\n<li>Assume at-least-once delivery and design consumers to handle duplicates.<\/li>\n<li>Deploy consumers with graceful shutdown to avoid losing progress (commit offsets\/cursor state appropriately).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Operations best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Define naming standards:<\/li>\n<li><code>env-domain-purpose<\/code> (e.g., <code>prod-orders-events<\/code>)<\/li>\n<li>Tag resources:<\/li>\n<li><code>costCenter<\/code>, <code>owner<\/code>, <code>environment<\/code>, <code>dataClassification<\/code><\/li>\n<li>Set up alarms on:<\/li>\n<li>publish errors<\/li>\n<li>consumer errors<\/li>\n<li>throughput saturation indicators (where available)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Governance best practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Maintain an event catalog (what streams exist, what they contain, owners, schema versions).<\/li>\n<li>Define data classification and PII rules for event payloads.<\/li>\n<li>Use change management for stream configuration (retention, partition changes).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">12. Security Considerations<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Identity and access model<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OCI Streaming access is governed by <strong>IAM policies<\/strong> and compartment scoping.<\/li>\n<li>Separate responsibilities:<\/li>\n<li><strong>Streaming administrators<\/strong>: create\/delete pools\/streams, configure settings<\/li>\n<li><strong>Producers<\/strong>: publish only<\/li>\n<li><strong>Consumers<\/strong>: consume only<\/li>\n<\/ul>\n\n\n\n<p><strong>Recommendation:<\/strong> Create distinct groups\/dynamic groups for each role and keep policies minimal.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Encryption<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>In transit<\/strong>: use TLS endpoints (standard for OCI services).<\/li>\n<li><strong>At rest<\/strong>: managed services typically encrypt at rest; confirm Streaming\u2019s encryption behavior and any customer-managed key options in your region.<\/li>\n<\/ul>\n\n\n\n<p>If customer-managed keys (CMK) are supported:\n&#8211; Use <strong>OCI Vault<\/strong> keys.\n&#8211; Restrict key usage and rotate keys per policy.<\/p>\n\n\n\n<blockquote>\n<p>Verify in official docs: exact CMK support and configuration steps for Streaming.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Network exposure<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Prefer private connectivity patterns when required by policy:<\/li>\n<li>Private endpoints (if supported)<\/li>\n<li>VCN controls + egress restrictions<\/li>\n<li>On-prem connectivity using FastConnect\/VPN for consumers\/producers on-prem<\/li>\n<\/ul>\n\n\n\n<blockquote>\n<p>Verify in official docs: Streaming private network access options and how they are configured.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Secrets handling<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Avoid embedding API keys\/auth tokens in code.<\/li>\n<li>Store secrets in <strong>OCI Vault<\/strong> and retrieve at runtime.<\/li>\n<li>Rotate credentials regularly and revoke keys immediately after personnel changes.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Audit\/logging<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use <strong>OCI Audit<\/strong> for control-plane events (resource creation\/deletion, policy changes).<\/li>\n<li>For data-plane telemetry, rely on service metrics\/logs where available and implement application-side logging for publish\/consume errors.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Compliance considerations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Classify event data: PII, PCI, PHI, internal-only.<\/li>\n<li>Minimize sensitive data in event payloads; prefer references (IDs) to full sensitive records.<\/li>\n<li>Apply retention and deletion policies consistent with regulations.<\/li>\n<li>If required, keep data within region boundaries and validate any cross-region replication or consumption.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Common security mistakes<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Overly broad policies like \u201cmanage all-resources in tenancy\u201d for app identities.<\/li>\n<li>Sending secrets\/PII in plaintext payloads without clear justification.<\/li>\n<li>Exposing producers\/consumers on public subnets without strict egress\/ingress controls.<\/li>\n<li>Not rotating API keys and auth tokens.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Secure deployment recommendations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Use least privilege IAM.<\/li>\n<li>Use private networking where required.<\/li>\n<li>Centralize secrets in Vault.<\/li>\n<li>Enable strong observability and alert on publish\/consume failures.<\/li>\n<li>Implement payload validation and schema enforcement in producers and\/or a gateway layer.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">13. Limitations and Gotchas<\/h2>\n\n\n\n<blockquote>\n<p>These are common streaming-system realities plus OCI-specific considerations. Always confirm exact OCI Streaming limits in the service limits documentation.<\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\">Known limitations (typical patterns)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Ordering is per partition<\/strong>, not global.<\/li>\n<li><strong>Duplicates are possible<\/strong> in retry scenarios; consumers should be idempotent.<\/li>\n<li><strong>Retention is finite<\/strong>; once expired, events can\u2019t be replayed.<\/li>\n<li><strong>Message size limits<\/strong> exist; large payloads should go to Object Storage with only references in the stream.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Quotas and service limits<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Streams, partitions, throughput, and retention have limits.<\/li>\n<li>Limits differ by region\/tenancy and can require requests to increase.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Regional constraints<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Not all OCI regions offer the same services\/features.<\/li>\n<li>Some integrations (connectors, private endpoints) may be region-limited.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Pricing surprises<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fan-out increases read traffic and possibly cost.<\/li>\n<li>Cross-region consumption or egress can add network charges.<\/li>\n<li>Longer retention can increase storage-related costs.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Compatibility issues (Kafka interoperability)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kafka compatibility does not guarantee full Kafka feature parity.<\/li>\n<li>Authentication configuration is commonly the source of confusion (SASL\/TLS\/auth token vs IAM signing). Verify current official instructions for Kafka client setup.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Operational gotchas<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Consumer lag may not be fully visible unless you implement consumer-side metrics.<\/li>\n<li>Partition key choice can cause hot partitions (skew).<\/li>\n<li>Changing partition counts can be limited and can impact ordering\/consumer scaling strategies\u2014verify what OCI Streaming supports for resizing.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Migration challenges<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Moving from self-managed Kafka requires:<\/li>\n<li>mapping topics \u2194 streams<\/li>\n<li>translating auth and ACLs to OCI IAM<\/li>\n<li>validating client compatibility<\/li>\n<li>revisiting retention and replay workflows<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">14. Comparison with Alternatives<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Alternatives in Oracle Cloud (nearest fits)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>OCI Service Connector Hub<\/strong>: managed data movement between OCI services (not a general-purpose event log).<\/li>\n<li><strong>OCI Events<\/strong>: event routing for OCI resource events and some application patterns; not the same as durable, replayable streaming.<\/li>\n<li><strong>OCI Queue<\/strong> (if available in your environment): point-to-point messaging with different semantics (often simpler for work queues).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Alternatives in other clouds<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>AWS<\/strong>: Kinesis Data Streams (managed streaming), MSK (managed Kafka)<\/li>\n<li><strong>Azure<\/strong>: Event Hubs (streaming), Event Grid (routing), Service Bus (queues\/topics)<\/li>\n<li><strong>Google Cloud<\/strong>: Pub\/Sub (global messaging), managed Kafka offerings via partners<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Open-source\/self-managed alternatives<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Apache Kafka<\/strong> on VMs or Kubernetes<\/li>\n<li><strong>Redpanda<\/strong> (Kafka API compatible)<\/li>\n<li><strong>Pulsar<\/strong><\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Comparison table<\/h4>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Option<\/th>\n<th>Best For<\/th>\n<th>Strengths<\/th>\n<th>Weaknesses<\/th>\n<th>When to Choose<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Oracle Cloud Streaming<\/strong><\/td>\n<td>OCI-native event streaming<\/td>\n<td>Managed service; OCI IAM governance; integrates with OCI services<\/td>\n<td>Must learn OCI-specific concepts; Kafka parity must be validated<\/td>\n<td>You are on Oracle Cloud and want managed streaming with OCI governance<\/td>\n<\/tr>\n<tr>\n<td><strong>OCI Service Connector Hub<\/strong><\/td>\n<td>Moving data between OCI services<\/td>\n<td>Minimal code; operationally simple<\/td>\n<td>Not a general-purpose replayable stream; connector limits<\/td>\n<td>You need routing\/ETL between OCI services with low engineering effort<\/td>\n<\/tr>\n<tr>\n<td><strong>OCI Events<\/strong><\/td>\n<td>Event routing for OCI events<\/td>\n<td>Good for infrastructure eventing<\/td>\n<td>Not designed as high-throughput event log<\/td>\n<td>You need event triggers for OCI resource lifecycle events<\/td>\n<\/tr>\n<tr>\n<td><strong>OCI Queue<\/strong> (verify availability)<\/td>\n<td>Work queues, async tasks<\/td>\n<td>Simpler semantics; often easier than streaming<\/td>\n<td>Not designed for replayable event logs\/fan-out analytics<\/td>\n<td>You need task distribution rather than event streaming<\/td>\n<\/tr>\n<tr>\n<td><strong>Apache Kafka (self-managed)<\/strong><\/td>\n<td>Full Kafka control and ecosystem<\/td>\n<td>Maximum flexibility; full feature set<\/td>\n<td>Operational burden; scaling\/patching; cost of ops<\/td>\n<td>You need features not supported by managed services or strict custom controls<\/td>\n<\/tr>\n<tr>\n<td><strong>AWS Kinesis \/ Azure Event Hubs \/ GCP Pub\/Sub<\/strong><\/td>\n<td>Streaming on other clouds<\/td>\n<td>Deep integration within their ecosystems<\/td>\n<td>Cross-cloud adds complexity and egress costs<\/td>\n<td>Your workloads primarily run in that cloud ecosystem<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">15. Real-World Example<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Enterprise example: Retail order event backbone on Oracle Cloud<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: A retailer has multiple systems\u2014web checkout, inventory, fulfillment, CRM\u2014and needs real-time, decoupled integration. Synchronous calls are causing cascading failures during peak traffic.<\/li>\n<li><strong>Proposed architecture<\/strong>:<\/li>\n<li>Producers (checkout, payment, inventory) publish domain events to OCI Streaming streams such as <code>orders<\/code>, <code>payments<\/code>, <code>inventory<\/code>.<\/li>\n<li>Consumers run on OKE and Functions:<ul>\n<li>fraud scoring consumer<\/li>\n<li>fulfillment orchestrator<\/li>\n<li>analytics loader<\/li>\n<\/ul>\n<\/li>\n<li>Service Connector Hub archives raw events to Object Storage for compliance and reprocessing.<\/li>\n<li>Monitoring and alarms on publish errors and consumer failures.<\/li>\n<li><strong>Why Streaming was chosen<\/strong>:<\/li>\n<li>Managed service reduces ops overhead.<\/li>\n<li>Replay supports reprocessing and audit needs (within retention + archive).<\/li>\n<li>Fits Oracle Cloud governance model (IAM\/compartments\/tags).<\/li>\n<li><strong>Expected outcomes<\/strong>:<\/li>\n<li>Reduced coupling and fewer cascading outages.<\/li>\n<li>Faster integration of new systems (subscribe to existing streams).<\/li>\n<li>Better observability into business event flow.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Startup\/small-team example: SaaS audit and webhook fan-out<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Problem<\/strong>: A small SaaS team needs to record user and admin actions for audit and to trigger webhooks for customer integrations. Direct webhook delivery is unreliable; retries overload the app.<\/li>\n<li><strong>Proposed architecture<\/strong>:<\/li>\n<li>App publishes audit events to <code>audit-events<\/code> stream.<\/li>\n<li>A consumer service reads the stream and delivers customer webhooks with retries and rate limiting.<\/li>\n<li>Another consumer archives events to Object Storage.<\/li>\n<li><strong>Why Streaming was chosen<\/strong>:<\/li>\n<li>A single scalable pipeline supports multiple consumers without duplicating publish logic.<\/li>\n<li>Replay helps recover from webhook downtime.<\/li>\n<li><strong>Expected outcomes<\/strong>:<\/li>\n<li>More reliable webhook delivery.<\/li>\n<li>Cleaner separation between app logic and integration delivery.<\/li>\n<li>Easier compliance reporting via archived audit events.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">16. FAQ<\/h2>\n\n\n\n<p>1) <strong>Is Oracle Cloud Streaming the same as Apache Kafka?<\/strong><br\/>\nNo. Streaming is an OCI managed service. It can interoperate with Kafka tooling in certain ways, but it is not \u201cKafka itself.\u201d Verify Kafka compatibility scope in official docs.<\/p>\n\n\n\n<p>2) <strong>What\u2019s the difference between a stream pool and a stream?<\/strong><br\/>\nA stream pool is a container\/management boundary for streams. A stream is the actual message log you publish to and consume from.<\/p>\n\n\n\n<p>3) <strong>How do partitions affect my design?<\/strong><br\/>\nPartitions increase throughput and parallelism while preserving ordering within a partition. Your partition key strategy determines ordering and load distribution.<\/p>\n\n\n\n<p>4) <strong>Can multiple applications consume the same stream?<\/strong><br\/>\nYes. Multiple consumers or consumer groups can read the same stream independently, which is a major benefit of event streaming.<\/p>\n\n\n\n<p>5) <strong>Does Streaming guarantee exactly-once delivery?<\/strong><br\/>\nStreaming systems commonly provide at-least-once delivery and require idempotent consumers for correctness. Verify OCI Streaming\u2019s guarantees in official docs.<\/p>\n\n\n\n<p>6) <strong>How do I handle schema evolution?<\/strong><br\/>\nUse versioned schemas (Avro\/Protobuf\/JSON schema) and backward-compatible changes. Consider a schema registry approach (OCI-native or external) based on your needs.<\/p>\n\n\n\n<p>7) <strong>How long are messages retained?<\/strong><br\/>\nRetention is configurable within service limits. The maximum retention depends on OCI Streaming limits\u2014verify in the documentation for your region.<\/p>\n\n\n\n<p>8) <strong>What\u2019s the max message size?<\/strong><br\/>\nThere is a maximum message size; large payloads should be stored in Object Storage and referenced by ID\/URL in the stream. Verify the current size limit in official docs.<\/p>\n\n\n\n<p>9) <strong>How do I secure producers and consumers?<\/strong><br\/>\nUse IAM policies and workload identities (Instance Principals\/Resource Principals) where possible; store secrets in OCI Vault; restrict network access.<\/p>\n\n\n\n<p>10) <strong>Can I access Streaming privately without the public internet?<\/strong><br\/>\nSome OCI services support private endpoints or private access patterns. Verify current Streaming networking options in official docs for your region.<\/p>\n\n\n\n<p>11) <strong>How do I monitor consumer lag?<\/strong><br\/>\nSome lag signals may require client-side tracking (offsets processed vs latest). Use OCI Monitoring where metrics exist, plus app-level metrics.<\/p>\n\n\n\n<p>12) <strong>How do I archive data for long-term retention?<\/strong><br\/>\nUse Service Connector Hub or a consumer to write messages to Object Storage, then use lifecycle policies for retention and tiering.<\/p>\n\n\n\n<p>13) <strong>What\u2019s the best way to run consumers at scale?<\/strong><br\/>\nOKE is common for long-running consumers; Functions can work for event-driven processing but depends on trigger mechanics and scaling model. Verify best practices for your workload.<\/p>\n\n\n\n<p>14) <strong>How do retries affect duplicates?<\/strong><br\/>\nProducer retries can re-send messages if acknowledgement status is uncertain. Consumers must handle duplicates via idempotency keys or dedupe logic.<\/p>\n\n\n\n<p>15) <strong>Should I create one stream per event type or combine events?<\/strong><br\/>\nUse domain-driven boundaries: often one stream per domain or major event family. Too many streams adds governance overhead; too few can cause schema chaos. Use naming + schema rules.<\/p>\n\n\n\n<p>16) <strong>How do I migrate from Kafka to OCI Streaming?<\/strong><br\/>\nMap Kafka topics to streams, review partitions\/retention, adjust authentication and client config, and validate compatibility. Run parallel pipelines during cutover.<\/p>\n\n\n\n<p>17) <strong>Is Streaming suitable for log ingestion?<\/strong><br\/>\nYes, often. But ensure the retention, throughput, and downstream indexing\/storage patterns are cost-effective and meet compliance requirements.<\/p>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">17. Top Online Resources to Learn Streaming<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Resource Type<\/th>\n<th>Name<\/th>\n<th>Why It Is Useful<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Official documentation<\/td>\n<td>OCI Streaming docs (home) \u2014 https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Streaming\/home.htm<\/td>\n<td>Canonical concepts, APIs, limits, and how-to guidance<\/td>\n<\/tr>\n<tr>\n<td>Official docs (IAM)<\/td>\n<td>OCI IAM docs \u2014 https:\/\/docs.oracle.com\/en-us\/iaas\/Content\/Identity\/home.htm<\/td>\n<td>Policies, groups, dynamic groups, and auth patterns used by Streaming<\/td>\n<\/tr>\n<tr>\n<td>Official pricing<\/td>\n<td>Oracle Cloud Pricing \u2014 https:\/\/www.oracle.com\/cloud\/pricing\/<\/td>\n<td>Pricing entry point for all OCI services<\/td>\n<\/tr>\n<tr>\n<td>Official price list<\/td>\n<td>OCI Price List \u2014 https:\/\/www.oracle.com\/cloud\/price-list\/<\/td>\n<td>Region\/SKU-based meters and rates (navigate to Integration\/Streaming)<\/td>\n<\/tr>\n<tr>\n<td>Pricing calculator<\/td>\n<td>OCI Cost Estimator \u2014 https:\/\/www.oracle.com\/cloud\/costestimator.html<\/td>\n<td>Build estimates based on expected usage<\/td>\n<\/tr>\n<tr>\n<td>SDK docs<\/td>\n<td>OCI Python SDK \u2014 https:\/\/github.com\/oracle\/oci-python-sdk<\/td>\n<td>SDK install, examples, and API references<\/td>\n<\/tr>\n<tr>\n<td>SDK docs<\/td>\n<td>OCI Java SDK \u2014 https:\/\/github.com\/oracle\/oci-java-sdk<\/td>\n<td>Useful for enterprise producers\/consumers in Java ecosystems<\/td>\n<\/tr>\n<tr>\n<td>Official tutorials\/labs<\/td>\n<td>Oracle LiveLabs \u2014 https:\/\/developer.oracle.com\/livelabs\/<\/td>\n<td>Hands-on workshops; search for \u201cStreaming\u201d labs<\/td>\n<\/tr>\n<tr>\n<td>Architecture guidance<\/td>\n<td>OCI Architecture Center \u2014 https:\/\/docs.oracle.com\/en\/solutions\/<\/td>\n<td>Reference architectures; search for event-driven\/streaming patterns<\/td>\n<\/tr>\n<tr>\n<td>Community (trusted)<\/td>\n<td>Oracle Cloud Infrastructure Blog \u2014 https:\/\/blogs.oracle.com\/cloud-infrastructure\/<\/td>\n<td>Practical updates and patterns; verify against docs for specifics<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">18. Training and Certification Providers<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Institute<\/th>\n<th>Suitable Audience<\/th>\n<th>Likely Learning Focus<\/th>\n<th>Mode<\/th>\n<th>Website URL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>DevOpsSchool.com<\/td>\n<td>DevOps engineers, cloud engineers, platform teams<\/td>\n<td>DevOps + cloud operations; may include OCI integration patterns<\/td>\n<td>Check website<\/td>\n<td>https:\/\/www.devopsschool.com\/<\/td>\n<\/tr>\n<tr>\n<td>ScmGalaxy.com<\/td>\n<td>Beginners to intermediate engineers<\/td>\n<td>SCM\/DevOps foundations; may extend to cloud tooling<\/td>\n<td>Check website<\/td>\n<td>https:\/\/www.scmgalaxy.com\/<\/td>\n<\/tr>\n<tr>\n<td>CLoudOpsNow.in<\/td>\n<td>Cloud ops\/SRE\/operations teams<\/td>\n<td>Cloud operations practices and tooling<\/td>\n<td>Check website<\/td>\n<td>https:\/\/cloudopsnow.in\/<\/td>\n<\/tr>\n<tr>\n<td>SreSchool.com<\/td>\n<td>SREs, reliability engineers, ops leads<\/td>\n<td>Reliability engineering, monitoring, incident response<\/td>\n<td>Check website<\/td>\n<td>https:\/\/sreschool.com\/<\/td>\n<\/tr>\n<tr>\n<td>AiOpsSchool.com<\/td>\n<td>Ops teams and engineers adopting AIOps<\/td>\n<td>Observability, AIOps concepts, automation<\/td>\n<td>Check website<\/td>\n<td>https:\/\/aiopsschool.com\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">19. Top Trainers<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Platform\/Site<\/th>\n<th>Likely Specialization<\/th>\n<th>Suitable Audience<\/th>\n<th>Website URL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>RajeshKumar.xyz<\/td>\n<td>DevOps\/cloud training content<\/td>\n<td>Engineers seeking practical guidance<\/td>\n<td>https:\/\/rajeshkumar.xyz\/<\/td>\n<\/tr>\n<tr>\n<td>devopstrainer.in<\/td>\n<td>DevOps training<\/td>\n<td>Beginners to intermediate DevOps practitioners<\/td>\n<td>https:\/\/devopstrainer.in\/<\/td>\n<\/tr>\n<tr>\n<td>devopsfreelancer.com<\/td>\n<td>Freelance DevOps services\/training platform<\/td>\n<td>Teams needing targeted enablement<\/td>\n<td>https:\/\/devopsfreelancer.com\/<\/td>\n<\/tr>\n<tr>\n<td>devopssupport.in<\/td>\n<td>DevOps support\/training<\/td>\n<td>Ops teams needing hands-on support<\/td>\n<td>https:\/\/devopssupport.in\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">20. Top Consulting Companies<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Company<\/th>\n<th>Likely Service Area<\/th>\n<th>Where They May Help<\/th>\n<th>Consulting Use Case Examples<\/th>\n<th>Website URL<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>cotocus.com<\/td>\n<td>Cloud\/DevOps consulting<\/td>\n<td>Architecture, implementation, automation<\/td>\n<td>Event-driven architecture rollout; CI\/CD + observability integration<\/td>\n<td>https:\/\/cotocus.com\/<\/td>\n<\/tr>\n<tr>\n<td>DevOpsSchool.com<\/td>\n<td>DevOps and cloud consulting<\/td>\n<td>Enablement, platform engineering support<\/td>\n<td>Building streaming consumers on OKE; operational best practices<\/td>\n<td>https:\/\/www.devopsschool.com\/<\/td>\n<\/tr>\n<tr>\n<td>DEVOPSCONSULTING.IN<\/td>\n<td>DevOps consulting services<\/td>\n<td>DevOps transformations and tooling<\/td>\n<td>Production readiness reviews; IAM and governance patterns for OCI<\/td>\n<td>https:\/\/devopsconsulting.in\/<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">21. Career and Learning Roadmap<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">What to learn before Streaming<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>OCI fundamentals:<\/li>\n<li>Compartments, VCN, IAM policies, regions<\/li>\n<li>Basic distributed systems concepts:<\/li>\n<li>at-least-once delivery, idempotency, ordering, backpressure<\/li>\n<li>API and security basics:<\/li>\n<li>TLS, auth, secret handling<\/li>\n<li>Observability basics:<\/li>\n<li>logs, metrics, tracing, alerting<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">What to learn after Streaming<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Event-driven architecture patterns:<\/li>\n<li>outbox pattern, sagas, CQRS, event sourcing (carefully)<\/li>\n<li>Stream processing:<\/li>\n<li>windowing, aggregation, enrichment (framework depends on your stack)<\/li>\n<li>Data engineering on OCI:<\/li>\n<li>Object Storage data lakes, analytics services, ETL\/ELT patterns<\/li>\n<li>Production operations:<\/li>\n<li>SLOs, error budgets, incident response, capacity planning<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Job roles that use it<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cloud engineer \/ platform engineer<\/li>\n<li>Integration engineer<\/li>\n<li>DevOps engineer \/ SRE<\/li>\n<li>Data engineer (streaming ingestion)<\/li>\n<li>Solutions architect<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Certification path (if available)<\/h3>\n\n\n\n<p>Oracle certifications change over time. Check Oracle University for current OCI certifications and learning paths:\n&#8211; https:\/\/education.oracle.com\/<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Project ideas for practice<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Build an event-driven \u201corders\u201d demo with producer + multiple consumers.<\/li>\n<li>Implement an archiver: Streaming \u2192 Object Storage with hourly files.<\/li>\n<li>Create a real-time alerting consumer that triggers notifications on threshold events.<\/li>\n<li>Add schema validation and versioning for events.<\/li>\n<li>Deploy consumers on OKE with autoscaling and dashboards.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">22. Glossary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Streaming<\/strong>: Continuous publishing and consumption of events\/messages in near real time.<\/li>\n<li><strong>Event<\/strong>: A record representing something that happened (e.g., <code>OrderCreated<\/code>).<\/li>\n<li><strong>Message<\/strong>: The unit of data written to and read from a stream.<\/li>\n<li><strong>Stream<\/strong>: The logical log of messages in OCI Streaming.<\/li>\n<li><strong>Stream Pool<\/strong>: A management boundary that contains streams.<\/li>\n<li><strong>Partition<\/strong>: A shard of a stream that preserves ordering within itself and enables parallelism.<\/li>\n<li><strong>Producer<\/strong>: An app\/service that publishes messages to a stream.<\/li>\n<li><strong>Consumer<\/strong>: An app\/service that reads messages from a stream.<\/li>\n<li><strong>Offset<\/strong>: A position within a partition indicating message order.<\/li>\n<li><strong>Cursor<\/strong>: A token\/position used to read messages from a stream (OCI Streaming data plane concept).<\/li>\n<li><strong>Retention<\/strong>: How long messages are kept before they expire.<\/li>\n<li><strong>Idempotency<\/strong>: Ability to process the same message more than once without changing the result incorrectly.<\/li>\n<li><strong>Fan-out<\/strong>: Multiple consumers reading the same stream.<\/li>\n<li><strong>Control plane<\/strong>: APIs for creating\/managing resources (pools\/streams\/policies).<\/li>\n<li><strong>Data plane<\/strong>: APIs for producing\/consuming messages.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator\" \/>\n\n\n\n<h2 class=\"wp-block-heading\">23. Summary<\/h2>\n\n\n\n<p>Oracle Cloud <strong>Streaming<\/strong> is OCI\u2019s managed event streaming service in the <strong>Integration<\/strong> category. It provides durable, partitioned streams that decouple producers from consumers and enable real-time pipelines, microservices integration, and replayable event processing.<\/p>\n\n\n\n<p>It matters because it reduces operational overhead compared to self-managed streaming platforms while fitting into Oracle Cloud governance (IAM, compartments, audit) and observability (Monitoring\/Logging). Cost is driven primarily by throughput\/partitioning, retention, consumer fan-out, and network egress\u2014so design with clear throughput targets and retention requirements.<\/p>\n\n\n\n<p>Use Streaming when you need scalable event distribution and replay. Avoid it for simple task queues or when you need strict end-to-end exactly-once semantics without building idempotency. Next, deepen your skills by reviewing the official Streaming docs, building a multi-consumer pipeline, and practicing production readiness (IAM, monitoring, alarms, cost controls).<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Integration<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[48,62],"tags":[],"class_list":["post-926","post","type-post","status-publish","format-standard","hentry","category-integration","category-oracle-cloud"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/926","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/comments?post=926"}],"version-history":[{"count":0,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/posts\/926\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/media?parent=926"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/categories?post=926"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/tutorials\/wp-json\/wp\/v2\/tags?post=926"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}