我的任务是设计一个处理 SMS 事务的系统。事务以来自服务提供商的 HTTP 请求的形式出现。在处理事务的过程中,相关系统需要联系我控制范围之外的几个其他系统,并进行一些处理。我可以选择几乎所有的东西,从实现语言到将要使用的数据库。我希望这个系统能够很好地扩展并且至少具有潜在的高可用性。基于以上内容,我的问题是:
1) 我应该选择哪种语言?我是全职 C++ 程序员,但 C++ 似乎根本不适合这个系统。我熟悉 Java、Python 和 PHP,并尝试过许多其他语言。我倾向于 Java。你也会选择 Java,还是更愿意选择其他语言(考虑到要求)?
2) 我认为要很好地扩展,这个系统需要异步处理事物,并且应该能够添加处理节点。为此,Java 消息系统看起来是一个正确的选择,例如 Apache ActiveMQ 实现。这是个好主意吗?
3) 显然这个东西需要某种数据库。 NoSQL 运动正在不断发展 - 我是否应该朝这个方向发展(例如 Apache Cassandra 看起来非常有前途),还是只使用久经考验的 PostgreSQL 或带有 InnoDB 的 MySQL?因为在我看来,这个东西需要 ACID。
答案1
使用您最习惯的语言和工具。关键任务项目不是学习新语言的时间和地点。我是一名 Python 和 C/C++ 开发人员,所以我可能会选择其中之一。但不要让我的语言选择影响您的判断 ;)。
话虽如此,Erlang 还是一个不错的选择,扩展性很好……只需添加更多硬件,它就可以水平扩展。问题是,它很难学。请参阅之前关于学习大型关键项目的评论。
同样适用于数据库选择。如果您熟悉 MySQL,请使用它。如果您对 Cassandra 了如指掌,那么它可能更适合您。
您所做的事情需要一种保存事务状态和原子性的机制。因此,请选择一种能够满足这些标准的语言和数据库组合。
异步操作必不可少,尤其是当您想要扩展时。我肯定会选择某种 AMQP 类型的消息平台,RabbitMQ 是我最喜欢的选择,但这只是基于我最有经验的选择。
与数据库相比,这种队列的主要优势在于,您可以在消息到达时进行事件驱动,而不是等待数据到达,或定期轮询数据库以查看是否有新数据等待。您可以将消息持久性设置为消息属性,这样如果服务器重新启动,消息就会被持久保存到磁盘。