MySQL到Elasticsearch的同步之路

六个月前写买好车搜索的Elasticsearch实践:初体验这篇文章的时候,我司刚刚迁移到Elasticserach,六个月之后的今天跟我最开始什么都不懂的时候搭起来的架构还是一模一样,这几天稍微有点时间,将Elasticsearch升级到了5.0.2,顺便整理了一下架构。 这一篇主要记录搜索与数据库同步的一些变化。

洪荒时代

Elasticsearch 2.0 之前,同步数据到Elasticsearch的功能由一个官方提供的插件(plugin)占领:river。通过实现不同的river插件,可以将数据从数据库,消息队列,nosql等等同步到Elasticsearch中,比如:elasticsearch-river-rabbitmqelasticsearch-river-couchdb等等。 以plugin方式运行的形式如图: 可以看到,插件与Elasticsearch运行在同一个jvm上,显然这会导致一系列的问题,正如Deprecating Rivers中所说:

分布式系统设计迷思(二)

继续上一篇文末提到的paxos,这一篇谈谈如何通过选主来解决paxos的活性问题。

问题

basic paxos存在一个活性(liveness)问题,如图: 首先注意每个proposer都只需要给超过半数的acceptor发起请求并取得一致即可,这里的例子共有5个server,所以这个数是3。

RabbitMQ上手指南

本文记录了在macOS Sierra 10.12.2环境下搭建RabbitMQ的过程。

安装RabbitMQ

通过homebrew安装:

1
brew install rabbitmq

完成后如图: 默认安装路径为:/usr/local/sbin,通过给~/.zshrc(shell使用zsh)添加:

并发下的Base64解码问题

上一篇文章中介绍的接口加密方案上线至今已有月余,考虑到加密后影响业务的风险以及用户的升级体验,近两个版本采用了明文和密文并存的灰度升级方式,这次发布的版本中决定完全移除明文请求,所以看了一眼近一个月加密逻辑中记录的日志,发现了一些问题。

在日志中存在很多以下报错信息:

错误最终从RSA解密方法中抛出,错误类型有:

1
2
3
javax.crypto.BadPaddingException: data hash wrong
	at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source) ~[bcprov-jdk14-138.jar:1.38.0]
	at javax.crypto.Cipher.doFinal(Cipher.java:2145) ~[na:1.7.0_10]

也有:

1
2
3
4
5
6
7
org.bouncycastle.crypto.DataLengthException: input too large for RSA cipher.
	at org.bouncycastle.crypto.engines.RSACoreEngine.convertInput(Unknown Source) ~[bcprov-jdk14-138.jar:1.38.0]
	at org.bouncycastle.crypto.engines.RSAEngine.processBlock(Unknown Source) ~[bcprov-jdk14-138.jar:1.38.0]
	at org.bouncycastle.crypto.encodings.OAEPEncoding.decodeBlock(Unknown Source) ~[bcprov-jdk14-138.jar:1.38.0]
	at org.bouncycastle.crypto.encodings.OAEPEncoding.processBlock(Unknown Source) ~[bcprov-jdk14-138.jar:1.38.0]
	at org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(Unknown Source) ~[bcprov-jdk14-138.jar:1.38.0]
	at javax.crypto.Cipher.doFinal(Cipher.java:2145) ~[na:1.7.0_10]

处理密文的切面中代码逻辑大致如下:

支付宝接入开发摘记

这一篇主要记录一下支付宝开发过程遇到的一些坑,后面再开一篇文章讲讲支付的架构设计。 这一期的支付开发主要接入支付宝,包含了入账和出账。

流程图

入账的流程图如下: