记录一下面试遇到的难点

1.mysql,怎么删除表中重复的数据(保留一条,并对某字段加上唯一索引
alert ignore table user add UNIQUE index(‘user_id’)

2.rabbitMQ,消费者报异常了该怎么办,如何重试、重发
RabbitMQ默认是自动确认的,也就是消费者消费到消息之后,MQ自动帮我们ACK,然后把队列里的消息删除
所以需要开启手动ACK机制,在你的监听方法上,加入AMQP 信道(Channel),在消费端处理完之后手动去确认。

 /**
   * 接收消息.
   * @param message 代理商信息.
   */
  @RabbitHandler
  @RabbitListener(queues = {QUEUE})
  public void initTemplate(Message message, Channel channel) throws IOException {
    try {
      InitTemplateConsumer
          .AgencyChangeDTO msg =
          objectMapper.readValue(message.getBody(), InitTemplateConsumer.AgencyChangeDTO.class);
      //操作类型
      Integer operateType = msg.getOperateType();
      Long parentAgencyId = msg.getParentAgencyId();
      //初始化外勤模板条件:一级代理商新增或者二级代理商审核通过
      if ((OperateTypeEnum.Add.getValue().equals(operateType)
          && (parentAgencyId == null || parentAgencyId == 0))
          || (OperateTypeEnum.Audit.getValue().equals(operateType) && parentAgencyId != null)) {
        templateBiz.init(msg.getAgencyId());
      }
    } catch (Exception e) {
      logger.error("int template error exception is {}", e);
	  channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
    }
    //手动确认
    channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);

  }

channel.basicAck(deliveryTag, multiple);
consumer处理成功后,通知broker删除队列中的消息,如果设置multiple=true,表示支持批量确认机制以减少网络流量。
例如:有值为5,6,7,8 deliveryTag的投递
如果此时channel.basicAck(8, true);则表示前面未确认的5,6,7投递也一起确认处理完毕。
如果此时channel.basicAck(8, false);则仅表示deliveryTag=8的消息已经成功处理。

channel.basicNack(deliveryTag, multiple, requeue);
consumer处理失败后,例如:有值为5,6,7,8 deliveryTag的投递。
如果channel.basicNack(8, true, true);表示deliveryTag=8之前未确认的消息都处理失败且将这些消息重新放回队列中。
如果channel.basicNack(8, true, false);表示deliveryTag=8之前未确认的消息都处理失败且将这些消息直接丢弃。
如果channel.basicNack(8, false, true);表示deliveryTag=8的消息处理失败且将该消息重新放回队列。
如果channel.basicNack(8, false, false);表示deliveryTag=8的消息处理失败且将该消息直接丢弃。

channel.basicReject(deliveryTag, requeue);
相比channel.basicNack,除了没有multiple批量确认机制之外,其他语义完全一样。
如果channel.basicReject(8, true);表示deliveryTag=8的消息处理失败且将该消息重新放回队列。
如果channel.basicReject(8, false);表示deliveryTag=8的消息处理失败且将该消息直接丢弃。
3.MQ顺序消费问题
4. 为什么阿里不推荐用FixedThreadPool

你可能感兴趣的:(缓存,面试记录,java基础)