Whatsapp服务器搭建(多节点/高性能版)

背景

最近我们在对接世界上各种主流APP的接口。Instagram,Facebook,Messager,VK等都比较好对接,搞清楚了具体协议,通过httpclient调用对方https的接口就行了。

但是Whatsapp的对接调用就没有那么简单了,它需要模拟一套whatsapp客户端,在本地进行加密/解密通信,同时它要考虑多节点,负载均衡,失效处理等情况。

--- ---

整个部署的简要图:

 

 

整体有一些概念:
CoreApp:核心的加密解密模块,需要有多个做负载均衡。官方建议为偶数n,并且要有n/2的机器做备份。
Webapp:认证激活用户,配置Webhook链接。官方建议最多只能有3个。后续要配置负载均衡或者域名解析的工作。
Master:负责CoreApp负载均衡的节点。同一时刻只有1个primary,自适应的,我们没有办法控制那台是主。官方建议最多只能有3个。
DB:所有的机器的信息都注册在这个数据库里,无论是master,core还是web。还有后续用户的聊天信息等。

WebhookServer:真正后台业务处理服务器。

--- ---

 

安装步骤

https://developers.facebook.com/docs/whatsapp/installation/prod-multiconnect

遇到困难:
1.由于整套方案需要安装docker,所以我们在阿里云上申请了7台ecs机器(其中一台做监控使用)和1台数据库。
dokcer安装方法:https://www.linuxtechi.com/install-docker-ce-centos-8-rhel-8/
docker-compse安装方法:https://docs.docker.com/compose/install/
2.由于whatsapp的方案对数据库版本有硬性要求,在连接阿里云的mysql 5.7时出现了1071异常SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes ,提了一个ticket给facebook,研究后发现是因为我们的默认innodb_large_prefix设置了OFF,应该设置为ON(在管理后台界面改了即可)。具体细节在这里: https://business.facebook.com/direct-support/question/989932118069267/?force_full_site=0&business_id=1050489708638471

小提示:安装部署按部就班的按照文档里去做就可以了,启动的时候有一个这个参数: EXTERNAL_HOSTNAME=$host ,目的是把你本机的地址注册到数据库上去。

我们在3台机器上都装了master,web和core,在另外3台机器上只装了3台core。

在一切都跑起来以后,就要进行shards配置了:https://developers.facebook.com/docs/whatsapp/multiconnect_mc#setup

这里的"shards": 1 | 2 | 4 | 8 | 16 | 32 ,数字只能选偶数,无法指定具体那台机器,全凭运气。

"主机数量n, 备用机器最好 n/2 "的意思是:有一台主机挂了,备用机器可以替换上去。
如果没有可用替换的,就会有1/n的概率路由到坏的机器上,造成消息丢失。

具体原理在这里:
https://developers.facebook.com/docs/whatsapp/availability-scaling

--- ---

增加监控

监控是必不可少的,按照这个来做:
https://developers.facebook.com/docs/whatsapp/monitoring/instance
期间没遇到什么困难,最后你就会看到这些令人激动的界面(记得把公网服务器的端口对外开放):

http://ip:9090/targets

http://ip:3000/d/whatsapp/biz-clients

(由于涉及到内部IP,暂时无法提供截图)

 

 

--- ---

 

调试API时的工具:PostMan

在调试whatsapp的API时,推荐使用PostMan,whatsapp已经把api写好格式,导入即可,详见文档:
https://developers.facebook.com/docs/whatsapp/guides/postman

WebHook CA Cert 证书

在配置完CA证书以后,我们需要上传关于这个域名的SSL证书,以便于wacore转发消息给webhook,如果没有配置成功,webhook不会接收到消息。

我从 xxx 下载了我们域名的crt证书(3个),但上传时需要用pem格式。
使用这个命令把crt证书改为pem证书
openssl x509 -in mycert.crt -out mycert.pem -outform PEM
然后用cat 根证书.pem 中间证书.pem 域名证书.pem > allinone.pem 把所有证书合在一起,上传完就OK啦。

查看日志

1. 使用 docker ps -a 找到wacore/或者其他出问题的pid

2.使用 docker logs pid 打开日志,查找 Fatal error 这类的字样来定位问题。

 

多看文档,反复看,很多情况都在文档里写的很清楚,配合实践会理解的更清楚。

 

--- ---

致谢

感谢 Facebook的同学 Mengyi Y. 不厌其烦的鼎力支持. 好评不断 !

 

--- ---

之前在网上没找到中文版关于安装whatsapp的相关信息,所以简要写一篇,希望能帮助到需要的人们。

愿世界和平,COVID-19早日消散。2020Apr01.

你可能感兴趣的:(Whatsapp服务器搭建(多节点/高性能版))