• hua168
    2019-03-07
    怎么判断代码是否使用分布式?

    1.是不是看企业将来战略要求?
    他们一般都会说将来用户量大,但是开发人员就那么几个,是不是一开始就弄分布式,只不过放在一两台服务器上,当用户量增加再慢慢分离?

    2.看公司未来3年是否用户量增加到要代码拆分的程度?
      如果用到最好前期就开始做吗?


    像我们水平扩展,做分布式,前期java web比较多的组合是
    nginx+spring Boot+dubbo(spring cloud)+redis+mongoDB/mysql

    nginx:反代,主要是处理静态,分担tomcat压力,前期和spring Boot1台
    spring Boot+dubbo(spring cloud):含tomcat,解决代码水平扩展,前期1台服务器
    redis:保存状态数据,一般是session比较多,前期做主从,前期一般2台
    mongoDB/mysql:数据库,只在数据,前期一般2台

    如果访问量过大:
      1. 数据库方面:变成1主多从,如果压力大就分库,再大就分表做sharding
      2. 前上面组合中前面添加多一个web代理,如nginx/haproxy,
         包含代码的web服务器复制几台现来,再做七层代理,如果一个七层代理不够,前面再加4层LVS
      3. redis:做成群集
    展开

    作者回复: 谢谢你的分享。这些是很好的经验!

    前期要考虑代码对分布式的支持,不一定真要做成分布式的。实际的分布式方案,最终还是取决于代码是什么样的。

    比方说我们文章中说到了,分离无状态数据,无状态服务。如果这些做好了,有状态服务可能只是很小的一块内容。这些早点做,可以提高系统的性能,延迟分布式的需求,简化分布式的实施。

    
     4
  • 轻歌赋
    2019-03-06
    所以一个web程序可以将信息简单分为三类
    1. 静态数据,客户端缓存,主要思考方向在如何让客户端更多的缓存,并且服务端能够随时消除缓存
    2. 无状态动态数据,可以考虑在单实例做缓存,提高效率,但是需要考虑如何通知清理缓存,怎么样设计缓存可以尽可能细粒度的清理缓存
    3. 有状态数据,可以考虑在redis等系统级的缓存处缓存,考虑到系统的扩张,一台缓存可能不够用,需要算法层次考虑分散用户数据,确保一个用户只会进入一部分缓存

    对于3,之前看过对于用户的ID进行hash的方式,但是感觉当缓存实例数量变化的时候取模是个问题,请问老师,这点如何在算法上进行设计呢?
    展开

    作者回复: 抱歉,我不了解redis。我猜测啊,模的值是不是可以等于缓存机器的数目?

    另外,等拿到用户ID的时候,已经进入应用层了,这时候连接可能已经建立,性能的瓶颈可能就是建立连接的前置的分配器。

     1
     2
  • hua168
    2019-03-07
    老师,之后的会介绍一些简单的防攻击之类的吗?我觉得代码写的再好,如果很容易被入侵,那也是等于0,我前公司网站经常时不时被入侵还不知道怎么回事T_T,服务器安全没有什么问题。
    防攻击是靠java的安全框架,还是自己手工写的防攻击代码?还是直接加多一层专门用来做防攻击过滤?
    起码保证代码是安全的,如果是网络类有专业的防火墙,如DDOS防火墙。

    作者回复: 安全漏洞大部分都是代码引起的,防火墙这些措施很重要,但是只能防范一部分攻击,价值最大的防范,要在代码层解决掉。我们第三部分会重点讲代码安全。

    
     1
  • hua168
    2019-03-07
    如果分布式前期已确定好(如:SpringBoot+redis+mysql)代码写好之后,如果再加多一些安全过滤来防攻击,是不是在直接在SpringBoot加多一层安全过滤?因为我在网上看到过这么一句话:

    Any problem in computer science can be solved by anther layer of indirection.
    计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。

    作者回复: 接着的问题是,这个中间层会有多复杂呢,值不值得呢?

    对于安全来说,中间层解决不了所有问题。很快,我们就进入这个专栏的第三部分了,到时候我们再聊代码安全问题。

    
     1
  • 夜空中最亮的星(华仔...
    2019-03-06
    有启发 有收获
    
    
我们在线,来聊聊吧