Skip to content

Commit 7e09a3b

Browse files
committed
WIP commit
1 parent bd43ee2 commit 7e09a3b

File tree

6 files changed

+51
-45
lines changed

6 files changed

+51
-45
lines changed

docker-compose.yaml

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,11 @@ services:
3636
context: .
3737
target: dev
3838
environment:
39-
WATCHFILES_FORCE_POLLING: true
4039
OTEL_SERVICE_NAME: "bootstrap-fastapi-dev"
4140
OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317"
4241
EVENTS__REDIS_BROKER_URL: "redis://redis:6379/2"
43-
EVENTS__IS_PUBLISHER: "True"
44-
EVENTS__IS_SUBSCRIBER: "True"
42+
EVENTS__REGISTER_PUBLISHERS: "True"
43+
EVENTS__REGISTER_SUBSCRIBERS: "True"
4544
working_dir: "/app/src"
4645
volumes:
4746
- '.:/app'
@@ -51,8 +50,9 @@ services:
5150
command:
5251
- faststream
5352
- run
54-
- event_consumer:create_app
53+
# - --help
5554
- --factory
55+
- event_consumer:create_app
5656

5757
event-docs:
5858
build:
@@ -64,8 +64,8 @@ services:
6464
OTEL_SERVICE_NAME: "bootstrap-fastapi-dev"
6565
OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317"
6666
EVENTS__REDIS_BROKER_URL: "redis://redis:6379/2"
67-
EVENTS__IS_PUBLISHER: "True"
68-
EVENTS__IS_SUBSCRIBER: "True"
67+
EVENTS__REGISTER_PUBLISHERS: "True"
68+
EVENTS__REGISTER_SUBSCRIBERS: "True"
6969
ports:
7070
- '8000:8000'
7171
working_dir: "/app/src"
@@ -96,6 +96,7 @@ services:
9696
OTEL_SERVICE_NAME: "bootstrap-fastapi-http"
9797
OTEL_EXPORTER_OTLP_ENDPOINT: "http://otel-collector:4317"
9898
EVENTS__REDIS_BROKER_URL: "redis://redis:6379/2"
99+
EVENTS__REGISTER_PUBLISHERS: "True"
99100
ports:
100101
- '8001:8000'
101102
volumes:

src/common/bootstrap.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@
22

33
from dependency_injector.containers import DynamicContainer
44
from dependency_injector.providers import Object
5-
from faststream.redis import RedisBroker, RedisRouter
5+
from faststream.redis import RedisBroker
66

77
# from gateways.event import FastStreamRedisGateway
88
from pydantic import BaseModel, ConfigDict
99

1010
from .config import AppConfig
1111
from .di_container import Container
1212
from .dramatiq import init_dramatiq
13-
from .faststream import init_router
13+
from .faststream import init_broker
1414
from .logs import init_logger
1515
from .storage import init_storage
1616

1717

1818
class InitReference(BaseModel):
1919
di_container: DynamicContainer
20-
faststream_broker: RedisRouter
20+
faststream_broker: RedisBroker
2121

2222
model_config = ConfigDict(arbitrary_types_allowed=True)
2323

@@ -32,13 +32,13 @@ def application_init(app_config: AppConfig) -> InitReference:
3232
init_logger(app_config)
3333
init_storage()
3434
init_dramatiq(app_config)
35-
broker = init_router(app_config.EVENTS)
35+
router = init_broker(app_config.EVENTS)
3636
# This is temporary, has to go directly in the Container
3737
# container.BookEventGatewayInterface.override(
3838
# Object(FastStreamRedisGateway(broker=broker))
3939
# )
4040

4141
return InitReference(
4242
di_container=container,
43-
faststream_broker=broker,
43+
faststream_broker=router,
4444
)

src/common/config.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ class AuthConfig(BaseModel):
1919

2020
class EventConfig(BaseModel):
2121
REDIS_BROKER_URL: str = ""
22-
TOPIC: Optional[str] = None
23-
IS_PUBLISHER: bool = False
24-
IS_SUBSCRIBER: bool = False
22+
SUBSCRIBER_TOPIC: Optional[str] = None
23+
REGISTER_PUBLISHERS: bool = False
24+
REGISTER_SUBSCRIBERS: bool = False
2525

2626

2727
class AppConfig(BaseSettings):

src/common/faststream.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,29 @@
22
from typing import Optional
33

44
import structlog
5-
from faststream import Logger
6-
7-
# from domains.events import get_topic_registry
8-
from faststream.redis import RedisRouter, RedisBroker, fastapi
9-
10-
# from faststream.redis.publisher.asyncapi import AsyncAPIPublisher
5+
from faststream.redis import RedisBroker, RedisRouter
116
from opentelemetry.instrumentation.faststream import RedisOtelMiddleware
127

13-
from common.config import EventConfig
148
from domains import event_registry
15-
from event_consumer import register_subscribers
9+
10+
from .config import EventConfig
1611

1712
logger = structlog.getLogger(__name__)
1813

1914

20-
def init_router(config: EventConfig) -> RedisRouter:
15+
def init_broker(config: EventConfig) -> RedisBroker:
2116
broker = RedisBroker(
2217
config.REDIS_BROKER_URL,
2318
middlewares=(RedisOtelMiddleware,),
2419
logger=structlog.getLogger("faststream.broker"),
2520
)
2621

27-
router = RedisRouter()
28-
register_publishers(router, config.TOPIC)
29-
if config.IS_SUBSCRIBER:
30-
register_subscribers(router, config.TOPIC)
31-
32-
broker.include_router(router)
33-
return router
34-
22+
if config.REGISTER_PUBLISHERS:
23+
router = RedisRouter()
24+
register_publishers(router, config.SUBSCRIBER_TOPIC)
25+
broker.include_router(router)
3526

27+
return broker
3628

3729

3830
def register_publishers(router: RedisRouter, topic: Optional[str] = None):

src/event_consumer/__init__.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,29 @@
55
"""
66

77
import os
8-
from typing import Union, Optional
8+
from typing import Optional, Union
99

1010
import structlog
1111
from faststream import FastStream
12-
from faststream.redis import RedisRouter
12+
from faststream.redis import RedisBroker, RedisRouter
1313
from opentelemetry import trace
1414
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
1515
from opentelemetry.sdk.resources import Resource
1616
from opentelemetry.sdk.trace import TracerProvider
1717
from opentelemetry.sdk.trace.export import BatchSpanProcessor
1818

19-
from alembic.env import logger
2019
from common import AppConfig, application_init
20+
from conftest import test_config
2121
from domains import event_registry
2222
from domains.books.events import BookCreatedV1, BookCreatedV1Data
2323

24+
"""
25+
For the sake of this example app we reuse the domain registry,
26+
which is used for publishing. In a real world these registries
27+
are different and separate.
28+
"""
29+
subscriber_registry = event_registry
30+
2431

2532
def setup_telemetry(service_name: str, otlp_endpoint: str) -> TracerProvider:
2633
resource = Resource.create(attributes={"service.name": service_name})
@@ -33,11 +40,15 @@ def setup_telemetry(service_name: str, otlp_endpoint: str) -> TracerProvider:
3340

3441

3542
def create_app(test_config: Union[AppConfig, None] = None) -> FastStream:
43+
config = test_config or AppConfig()
3644
setup_telemetry(
3745
"faststream", otlp_endpoint=os.environ["OTEL_EXPORTER_OTLP_ENDPOINT"]
3846
)
39-
router = application_init(AppConfig()).faststream_broker
40-
broker = router.broker
47+
broker = application_init(config).faststream_broker
48+
register_subscribers(broker)
49+
if config.EVENTS.REGISTER_SUBSCRIBERS:
50+
register_subscribers(broker)
51+
4152
app = FastStream(broker, logger=structlog.get_logger())
4253

4354
@app.after_startup
@@ -56,18 +67,20 @@ async def after_startup():
5667
return app
5768

5869

59-
60-
# TODO: Add Routing structure similar to the one in the fastapi and
61-
# move this in the event_consumer_module
62-
def register_subscribers(router: RedisRouter, topic: Optional[str] = None):
63-
if topic is not None and topic in event_registry.keys():
64-
topics_map = {topic: event_registry[topic]}
70+
# TODO: Add Routing structure similar to the one in the fastapi implementation
71+
def register_subscribers(broker: RedisBroker, topic: Optional[str] = None):
72+
if topic is not None and topic in subscriber_registry.keys():
73+
topics_map = {topic: subscriber_registry[topic]}
6574
else:
66-
topics_map = event_registry.copy()
75+
topics_map = subscriber_registry.copy()
6776

6877
logger = structlog.get_logger()
78+
router = RedisRouter()
6979

7080
for topic, event_type in topics_map.items():
81+
7182
@router.subscriber(topic)
7283
async def handler(msg: event_type) -> None: # type: ignore[valid-type]
7384
logger.info(f"Received message {type(msg)} {msg}")
85+
86+
broker.include_router(router)

src/http_app/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Union, Any
1+
from typing import Any, Union
22

33
from fastapi import FastAPI, Request
44
from faststream.broker.core.usecase import BrokerUsecase
@@ -36,7 +36,7 @@ def create_app(
3636
init_exception_handlers(app)
3737

3838
init_routes(app)
39-
add_faststream_router(app, ref.faststream_broker)
39+
# add_faststream_router(app, ref.faststream_broker)
4040

4141
"""
4242
OpenTelemetry prometheus exporter does not work together with automatic

0 commit comments

Comments
 (0)