答:消息队列的应用场景如下。
答:RabbitMQ 的优点如下:
答:RabbitMQ 包含以下三个重要的角色:
答:RabbitMQ 包含的重要组件有:ConnectionFactory(连接管理器)、Channel(信道)、Exchange(交换器)、Queue(队列)、RoutingKey(路由键)、BindingKey(绑定键) 等重要的组件,它们的作用如下:
答:消息持久化是把消息保存到物理介质上,以防止消息的丢失。
答:RabbitMQ 要实现消息持久化,必须满足以下 4 个条件:
答:消息持久化的缺点是很消耗性能,因为要写入硬盘要比写入内存性能较低很多,从而降低了服务器的吞吐量。可使用固态硬盘来提高读写速度,以达到缓解消息持久化的缺点。
答:使用 Java 代码连接 RabbitMQ 有以下两种方式:
方式一:
public static Connection GetRabbitConnection() {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setUsername(Config.UserName);
    factory.setPassword(Config.Password);
    factory.setVirtualHost(Config.VHost);
    factory.setHost(Config.Host);
    factory.setPort(Config.Port);
    Connection conn = null;
    try {
        conn = factory.newConnection();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return conn;
}
方式二:
public static Connection GetRabbitConnection2() {
    ConnectionFactory factory = new ConnectionFactory();
    // 连接格式:amqp://userName:password@hostName:portNumber/virtualHost
    String uri = String.format("amqp://%s:%s@%s:%d%s", Config.UserName, Config.Password, Config.Host, Config.Port,
            Config.VHost);
    Connection conn = null;
    try {
        factory.setUri(uri);
        factory.setVirtualHost(Config.VHost);
        conn = factory.newConnection();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return conn;
}
答:代码如下:
public static void main(String[] args) {
    publisher();     // 生产消息
    consumer();     // 消费消息
}
/\*\* \* 推送消息 \*/
public static void publisher() {
    // 创建一个连接
    Connection conn = ConnectionFactoryUtil.GetRabbitConnection();
    if (conn != null) {
        try {
            // 创建通道
            Channel channel = conn.createChannel();
            // 声明队列【参数说明:参数一:队列名称,参数二:是否持久化;参数三:是否独占模式;参数四:消费者断开连接时是否删除队列;参数五:消息其他参数】
            channel.queueDeclare(Config.QueueName, false, false, false, null);
            String content = String.format("当前时间:%s", new Date().getTime());
            // 发送内容【参数说明:参数一:交换机名称;参数二:队列名称,参数三:消息的其他属性-routing headers,此属性为MessageProperties.PERSISTENT\_TEXT\_PLAIN用于设置纯文本消息存储到硬盘;参数四:消息主体】
            channel.basicPublish("", Config.QueueName, null, content.getBytes("UTF-8"));
            System.out.println("已发送消息:" + content);
            // 关闭连接
            channel.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
/\*\* \* 消费消息 \*/
public static void consumer() {
    // 创建一个连接
    Connection conn = ConnectionFactoryUtil.GetRabbitConnection();
    if (conn != null) {
        try {
            // 创建通道
            Channel channel = conn.createChannel();
            // 声明队列【参数说明:参数一:队列名称,参数二:是否持久化;参数三:是否独占模式;参数四:消费者断开连接时是否删除队列;参数五:消息其他参数】
            channel.queueDeclare(Config.QueueName, false, false, false, null);
            // 创建订阅器,并接受消息
            channel.basicConsume(Config.QueueName, false, "", new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String routingKey = envelope.getRoutingKey(); // 队列名称
                    String contentType = properties.getContentType(); // 内容类型
                    String content = new String(body, "utf-8"); // 消息正文
                    System.out.println("消息正文:" + content);
                    channel.basicAck(envelope.getDeliveryTag(), false); // 手动确认消息【参数说明:参数一:该消息的index;参数二:是否批量应答,true批量确认小于index的消息】
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
答:RabbitMQ 消费类型也就是交换器(Exchange)类型有以下四种:
RabbitMQ 默认的是 direct 方式。
答:RabbitMQ 使用 ack 消息确认的方式保证每个消息都能被消费,开发者可根据自己的实际业务,选择 channel.basicAck() 方法手动确认消息被消费。
答:RabbitMQ 接收到消息之后可以不消费,在消息确认消费之前,可以做以下两件事:
A:cn.mq.rabbit.*
B:#.error
C:cn.mq.*
D:cn.mq.#
答:C
题目解析:“*”用于匹配一个分段(用“.”分割)的内容,“#”用于匹配 0 和多个字符。
A:topic 交换器
B:fanout 交换器
C:direct 交换器
D:以上都不是
答:C
题目解析:fanout 和 topic 都是广播形式的,因此无法获取历史消息,而 direct 可以。
答:RabbitMQ 包含事务功能,主要是对信道(Channel)的设置,主要方法有以下三个:
答:RabbitMQ 的事务在 autoAck=true 也就是自动消费确认的时候,事务是无效的。因为如果是自动消费确认,RabbitMQ 会直接把消息从队列中移除,即使后面事务回滚也不能起到任何作用。
答:Kafka 不能脱离 ZooKeeper 单独使用,因为 Kafka 使用 ZooKeeper 管理和协调 Kafka 的节点服务器。
答:Kafka 有两种数据保存策略:按照过期时间保留和按照存储的消息大小保留。
答:这个时候 Kafka 会执行数据清除工作,时间和大小不论哪个满足条件,都会清空数据。
答:以下情况可导致 Kafka 运行变慢:
答:Kafka 集群使用需要注意以下事项:
欢迎关注我的公众号,回复关键字“Java” ,将会有大礼相送!!! 祝各位面试成功!!!

%97%E5%8F%B7%E4%BA%8C%E7%BB%B4%E7%A0%81.png)
原文:https://www.cnblogs.com/dailyprogrammer/p/12272757.html