广播消息、批量消息
广播消息就是向所有用户发送消息。 如果我们希望所有订阅者都能收到有关某个主题的消息,可以使用广播消息。
举个例子 生产者发送10条消息,有2个订阅者,则这两个订阅者会分别收到10条消息, 而与广播模式相对应的集群模式这是 2个订阅者一共收到10条消息。
Rocketmq 消费者默认是集群的方式消费的,使用广播模式进行消费需要显示设置
核心:消费端设置消息模型 consumer.setMessageModel(MessageModel.BROADCASTING);
批量消息概述
批量发送消息能显著提高传递小消息的性能。限制是这些批量消息应该有相同的topic,相同的waitStoreMsgOK,而且不能是延时消息此外,这一批消息的总大小不应超过4MB。rocketmq建议每次批量消息大小大概在1MB。当消息大小超过4MB时,需要将消息进行分割
public class BatchProducer { public static void main(String[] args) throws MQClientException { DefaultMQProducer producer = new DefaultMQProducer("bath_group"); producer.setNamesrvAddr("192.168.21.29:9876"); producer.start(); String topic = "batchTopic"; List<Message> messages = new ArrayList(); messages.add(new Message(topic, "tagA", "ord1", "hi 0".getBytes())); messages.add(new Message(topic, "tagA", "ord2", "hi 1".getBytes())); messages.add(new Message(topic, "tagA", "ord3", "hi 2".getBytes())); ListSplitter splitter = new ListSplitter(messages); /** * 对批量消息进行拆分 */ while (splitter.hasNext()) { try { List<Message> listItem = splitter.next(); SendResult sendResult = producer.send(listItem); System.out.println("listItem:" + listItem + " sendResult:" + sendResult); } catch (Exception e) { e.printStackTrace(); } } producer.shutdown(); } } public class ListSplitter implements Iterator<List<Message>> { private final int SIZE_LIMIT = 1000 * 1000 * 1; private final List<Message> messages; private int currIndex; public ListSplitter(List<Message> messages) { this.messages = messages; } @Override public boolean hasNext() { return currIndex < messages.size(); } @Override public List<Message> next() { int nextIndex = currIndex; int totalSize = 0; for (; nextIndex < messages.size(); nextIndex++) { Message message = messages.get(nextIndex); int tmpSize = message.getTopic().length() + message.getBody().length; Map<String, String> properties = message.getProperties(); for (Map.Entry<String, String> entry : properties.entrySet()) { tmpSize += entry.getKey().length() + entry.getValue().length(); } /** * for log overhead */ tmpSize = tmpSize + 20; if (tmpSize > SIZE_LIMIT) { if (nextIndex - currIndex == 0) { nextIndex++; } break; } if (tmpSize + totalSize > SIZE_LIMIT) { break; } else { totalSize += tmpSize; } } List<Message> subList = messages.subList(currIndex, nextIndex); currIndex = nextIndex; return subList; } }
立志如山 静心求实
浙公网安备 33010602011771号