使用查询分离后,从20s优化到500ms,牛哇~
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;public class MessageSender {
private final static String QUEUE_NAME = "data_queue";public void send(String message) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
}
}
send方法,把数据作为消息发出去。import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.common.xcontent.XContentType;public class EsDataWriter {
private RestHighLevelClient client;public EsDataWriter(RestHighLevelClient client) {
this.client = client;
}public void writeToEs(String indexName, String jsonData) throws Exception {
IndexRequest indexRequest = new IndexRequest(indexName);
indexRequest.source(jsonData, XContentType.JSON);
IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println("Data written to ES with id: " + indexResponse.getId());
}
}
writeToEs方法,把数据写到ES里去。那这样,查询的时候咱们就不去主表查了,直接去ES里查。那速度,嗖嗖的,500毫秒就出结果了。es_synced,表示数据是否已经同步到ES了。ES消费者写入ES后可以更新一下这个字段,查询单条数据的时候,咱们先查这个字段,如果已经同步了,就直接去ES里查;如果还没同步,就等一会儿再查,或者从主表里查。