kafka实时返回浏览数据

在安装完kafka(Docker安装kafka_docker 部署kafka-CSDN博客),查看容器是否启动:

docker ps | grep -E 'kafka|zookeeper'

再用python开启服务

from fastapi import FastAPI, Request
from kafka import KafkaProducer
import kafka
import json
import logging
from datetime import datetime

# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s')

# 初始化 FastAPI 应用
app = FastAPI()

# 示例博客文章数据
blog_posts = [
    {"id": 1, "title": "First Post", "content": "This is the first post."},
    {"id": 2, "title": "Second Post", "content": "This is the second post."}
]

def produce_view_event(ip_address, post_id):
    """
    生成博客文章的查看事件。

    参数:
        ip_address (str): 查看者的 IP 地址。
        post_id (int): 被查看的文章 ID。
    """
    logging.info(f"生成查看事件,文章 ID: {post_id},IP 地址: {ip_address}")

    try:
        # 初始化 Kafka 生产者
        producer = KafkaProducer(
            bootstrap_servers='110.40.130.231:9092',
            value_serializer=lambda v: json.dumps(v).encode('utf-8')
        )

        # 准备发送到 Kafka 的消息
        message = {
            "ip_address": ip_address,
            "post_id": post_id,
            "event_type": "view"
        }

        logging.info(f"发送消息到 Kafka: {message}")
        future = producer.send('blog_views', value=message)

        try:
            # 等待消息成功发送
            record_metadata = future.get(timeout=10)
            logging.info(
                f"消息发送成功。主题: {record_metadata.topic}, 分区: {record_metadata.partition}, 偏移量: {record_metadata.offset}")
        except Exception as e:
            logging.error(f"发送消息失败: {e}")

        # 确保所有消息已发送并关闭生产者
        producer.flush()
        producer.close()

        # 将查看事件打印到控制台
        print_view_event(ip_address, post_id)
    except kafka.errors.NoBrokersAvailable as e:
        logging.error(f"没有可用的 Broker: {e}")

def print_view_event(ip_address, post_id):
    """
    打印博客文章的查看事件。

    参数:
        ip_address (str): 查看者的 IP 地址。
        post_id (int): 被查看的文章 ID。
    """
    event_type = "view"
    created_at = datetime.now().isoformat()
    print(
        f"View Event - IP Address: {ip_address}, Post ID: {post_id}, Event Type: {event_type}, Created At: {created_at}")

@app.get("/posts/{post_id}")
def get_post(post_id: int, request: Request):
    """
    根据 ID 获取博客文章。

    参数:
        post_id (int): 博客文章的 ID。
        request (Request): 进来的请求对象。

    返回:
        dict: 如果找到文章则返回文章,否则返回错误信息。
    """
    logging.info(f"收到请求,文章 ID: {post_id}")
    for post in blog_posts:
        if post["id"] == post_id:
            logging.info(f"找到文章: {post}")
            produce_view_event(request.client.host, post_id)
            return post
    return {"error": "文章未找到"}

if __name__ == "__main__":
    import uvicorn
    import os

    # 获取当前文件名(不带扩展名)供 UVicorn 使用
    app_modeel_name = os.path.basename(__file__).replace(".py", "")
    print(app_modeel_name)

    # 使用 UVicorn 运行 FastAPI 应用
    uvicorn.run(f"{app_modeel_name}:app", host='0.0.0.0', port=1213, reload=True)

访问:http://110.40.130.231:1213/posts/1

### 查看 Kafka 集群元数据 为了查看 Apache Kafka 集群的元数据,可以利用多种工具和技术来实现这一目标。Kafka 提供了内置命令行工具以及编程接口以便于管理和监控集群状态。 #### 使用 `kafka-topics.sh` 脚本获取主题信息 通过运行如下命令能够获得有关特定主题或者整个集群的主题列表及其分区分配情况: ```bash bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 [--topic topic_name] ``` 这条命令会返回一系列的信息,包括但不限于副本因子、ISR (In-Sync Replicas) 列表以及其他与该主题相关的细节[^3]。 #### 查询控制器日志 对于更深入地了解集群内部结构,则可以通过分析 ZooKeeper 或者 KRaft 模式的控制器日志来进行。当使用基于ZooKeeper的传统模式时,可以从 `/brokers/topics/{topic}` 和其他相关节点中提取到丰富的元数据;而在新引入的 KRaft 协议下,相应的信息会被记录在控制平面的日志文件里。 #### 借助第三方管理平台 除了官方提供的手段之外,还有许多开源项目和商业产品提供了图形化的界面用于展示并操作 Kafka 的元数据。例如 Confluent Control Center 就是一个非常流行的选择,它不仅支持直观地浏览集群拓扑图,还允许管理员执行诸如重新平衡副本之类的高级功能[^4]。 #### 编程方式访问 如果偏好程序化的方式处理这个问题,那么可以考虑采用 Java 客户端库中的 AdminClient API 。这使得开发者能够在应用程序层面动态查询集群的状态变化,如创建/删除 Topic 、调整配置项等动作的同时也能同步取得最新的元数据快照。 ```java AdminClient adminClient = AdminClient.create(properties); DescribeClusterResult describeClusterResult = adminClient.describeCluster(); List<Node> nodes = describeClusterResult.nodes().get(); // 获取Broker列表 String clusterId = describeClusterResult.clusterId().get(); // 获取集群ID ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值