写了好几篇这样的文章了,工作中时不时会遇到一些奇怪的问题。在没解决之前会觉得不可思议、匪夷所思、甚至怀疑人生,不过在解决之后又会觉得原来不过如此。现在奇怪的问题遇多了,也见怪不怪了,也能冷静下来思考,毕竟出错都是有原因的,都是有理有据的。

这里记录下这段时间遇到的一些奇怪的问题。

奇怪的事情1-部署程序后无法访问

当时是这样的,测试版本测试过没问题了,那天晚上准备联调正式环境版本的。于是切换好正式环境的配置文件。部署到服务器,通过浏览器发起请求。结果一直报错404。可是代码明明没有动过。重新打包部署,还是一样404。可是测试版本的包是能正常访问的。使用8080端口访问不行,使用80端口正式版本也不行。

于是本地部署,发现可以访问不会报404。把war包扔到另一台服务器上通过8080端口也是ok的。

奇怪的现象:正式环境之前的测试版本接口可以访问、现在的正式版本接口不能访问,另外本地部署接口可以访问,其他服务器上部署接口也可以访问。

当时大家在吃晚饭,吃完饭就要联调了,不想全部人等我一个人,当时心好慌。

于是尝试在正式环境服务器上通过curl使用8080端口发起访问,发现是可以访问的。又想起测试版本的url是不带端口号的也就是使用了默认的80端口,想到了nginx。总算知道是怎么回事。赶紧进到nginx目录,查看nginx.conf,果然:

然后突然想起这台服务器是没有开放8080端口的,但是开了80端口,因此得通过nginx做代理转发。而正式版本由于在nginx中没有为该uri进行转发,因此无法识别该url。

因此出现了测试版本能访问(nginx为该uri做了转发),正式版本不能访问(nginx没有为该uri做转发),在服务器内部可以访问(内网可以直接访问8080端口)。于是在nginx.conf中给正式包的uri做一个转发,转发到8080端口,即tomcat,接口就可以正常访问了。

嗯,问题就是出在nginx的转发上,由于服务器没有开启8080端口,因此得通过nginx做转发。而由于没有为正式版本的uri做转发,因此就无法通过nginx转发到tomcat上,因此接口就无法访问。

问题解决之前,真的觉得不可思议,解决之后,发现还挺有意思。果然得学习一下nginx,不然出了问题就不知道是出在nginx上。

奇怪的事情2-插入记录数多了

背景:写一个程序,从a表读取数据,然后字段做些操作,然后存入b表。第一次运行的时候报错了,提示说某个字段长度不足,于是修改了该字段的长度,再执行一遍,这次成功了。但是却发现插入的记录数量不对,多了几百条。插入的记录数跟a表的记录数不一致!把代码检查了一遍确认是没有问题的。可是为什么会多出几百条。

想通后觉得自己好傻,问题就出在第一次执行出错的时候,对于批量操作我没有加上事务功能。因此在出错之前的insert操作都是成功的。因此出现了部分数据成功入库。

对于不止一个update或delete的操作,要加上事务功能啊!!!

奇怪的事情3-mq发消息异常

背景:一个模块中使用mqtt中间件来发送消息和接收消息,服务部署到线上,一旦发送消息就会抛出EOFException,可是从打印出来的异常堆栈信息却完全看不出问题所在。更奇怪的是本地部署确实可以正常发送消息的,也能够接收到消息。可是修改的参数只有client_id这些配置信息。

也是把代码检查了一遍,没看出有什么端倪。再对比跟之前项目中用到的mqtt的代码,也没什么区别。于是又开始怀疑人生:为什么一样的配置,线上服务器上跑就出问题,本地服务器跑就正常?

最后想到了以前接触mqtt时大佬曾特别提到的一个参数——消息质量qos。代码中设置的qos为2,于是尝试改成1,再部署测试,发现问题解决了。于是上网一查,才突然意识到线上环境和本地环境还有一个地方是不一样的,那就是mqtt服务器。本地使用的是mosquito,而线上服务器使用的是rabbitMQ,而rabbitMQ是不支持qos2的。各种mqtt中间件对比如下:


由上图可知,rabbitMQ确实是不支持qos2的。顺藤摸瓜,得知原来mqtt服务器是有记录日志的,在服务器的/var/log/rabbitmq/目录下,通过日志,可以看到如下错误提示:

其实日志中就告诉了我们问题所在了:MQTT protocol error qos2_not_supported for connection

所以两个环境根本就不一样,一个是mosquito一个是rabbitMQ。于是乎,把qos设置为1,问题就解决了。

最后

奇怪的问题记录多了,也就见怪不怪了。因为我相信事出必有因,至少目前还没遇到那种想破头怎么查资料都解决不了的bug。目前遇到的都是因为自己哪个地方粗心写错了什么或者忽略了什么信息而导致的。

工作过程中,也明白了一点,多问为什么很重要。如果当初部署完发现访问不了在运维同事帮忙解决之后不去问几个为什么,可能以后自己回过头来看的时候会有各种疑惑:

  1. 为什么不通过8080端口进行访问?
  2. 为什么外网无法通过8080端口进行访问,内网却可以?
  3. 为什么部署在tomcat的服务要通过80端口访问?

多问几个为什么,一些问题自己也能解决了。因为8080端口没对外开放,因此外网无法通过8080端口访问,而本地是直接访问是可以的。因为8080端口没有开放而tomcat服务又是使用的8080端口,因此需要nginx做转发。通过配置使得一些请求可以通过80端口转发到8080端口。于是乎就得去看下nginx.conf中做了什么配置:

如上图所示,nginx.conf中设置了对于xxxTest为后缀的uri都会转发到8080端口。

有了这些基础,自己再提出一些疑问自己也能够独立解决了:

  • 为什么部署其他的程序无法访问,8080端口不行,80端口也不行?

因为nginx只对后缀为xxxxTest(项目名)的url进行转发处理,对于其他的服务,由于8080没有对外开放因此外网无法通过8080端口直接访问,再加上nginx中没有对该uri做配置转发,因此也无法通过80端口代理转发到8080端口,因此直接部署其他的服务,8080端口访问不了,80端口也访问不了。

20190326 工作中遇到的一些奇怪的问题相关推荐

  1. 《当程序员的那些狗日日子》(五)工作中,工作外

    和经理共事了几个月的时间,我对他也慢慢了解起来.他大概比我大三岁,来自新疆,但却是汉族人,是人民大学毕业的研究生.他说他在这里工作是朋友介绍进来的,他的朋友就是公司现在的总经理.每天中午吃过午饭后,我 ...

  2. 【干货】产品经理处理工作中突发事件的新技能Get!

    东东推荐:产品经理又称"产品汪",日常工作多而且繁琐,经常会出现突发事件需要处理,所以处理突发状况的技能已经是产品经理必备技能之一. 在日常工作中,我认为有且仅有以下3种情况: 制 ...

  3. 工作中的小技巧(一)

    学会怎么样问问题? 1.在问别人问题的时候,只要告诉对方有什么地方不明白,自己奇怪的地方就可以了,不要过多的阐述自己的观点,因为这样会影响对方思考或者是把对方往错误的方向引导,要做的就是耐心倾听对方的 ...

  4. Effective Java 在工作中的应用总结

    简介: <Effective Java>是一本经典的 Java 学习宝典,值得每位 Java 开发者阅读.笔者将书中和平日工作较密切的知识点做了部分总结. 作者 | 宜秋 来源 | 阿里技 ...

  5. 转:7招,教你在工作中高效做笔记

    做笔记是再熟悉不过的事情,上学时不知道做过多少笔记,但是笔记的功效也是各有千秋.上学那会儿,喜欢抄成绩好的同学的笔记,他们的笔记通常都做的比较详细而且清晰. 有调查显示好学生的笔记是他们高效学习的秘密 ...

  6. 学习前端如何建立自己的知识体系?工作中如何快速进阶?

    「自学」是不可能太「系统」的,因为没有人帮你把每一个阶段的学习内容定义清晰.由于缺乏别人提供的反馈,你没办法知道自己某一阶段的学习是否完成了.千锋广州老师一般的建议方式是,你去实体书店看看相关的书籍, ...

  7. R与SPSS、SAS相比较_Python 在数据分析工作中的地位与R语言、SAS、SPSS 比较如何?

    转自:http://m.elecfans.com/article/611407.html 统计分析的软件和程序分析 能够用来做统计分析的软件和程序很多,目前应用比较广泛的包括:SPSS, SAS.R语 ...

  8. 电子工程师自学成才pdf_作为一名自学成才的软件工程师,我在第一个月的工作中所学到的知识

    电子工程师自学成才pdf In this post, I will share my experiences and give advice now that I am six months into ...

  9. 工作中最让程序员疯狂的5件事

    Jason Silberman 通过一个幽默特别的观点阐述了在日常工作中那些让程序员变得疯狂的事情. 正如我所说,如果某个人正在测试你的代码,那你的感觉会怎么样呢? 如果像我一样是个程序员,当每周一正 ...

最新文章

  1. linux c 删除非空目录
  2. Cloudera Manager 5 和 CDH5 本地(离线)安装指南(Hadoop集群搭建)
  3. C语言 函数式宏的使用
  4. EasyUI DataGrid 合并单元格
  5. 背完这444句,你的口语绝对不成问题了
  6. pycharm导入python环境是空的_PyCharm导入python项目并配置虚拟环境的教程详解
  7. ediplus 复制编辑一列_EditPlus等编辑器选中列(块)的方法
  8. C语言,去你的策略模式!
  9. google i/o_Google I / O 2017最有希望的突破
  10. 广州IT销售菜鸟总结精华
  11. 奇奇怪怪的three.js特效(一)
  12. c语言abs作用是什么意思,c语言fabs()是什么意思?和abs()有什么区别
  13. 图像倾斜校正 Radon 变换原理及函数
  14. DAMO-YOLO | 超越所有YOLO,5行代码即可体验
  15. 关于excel选定任意行截图的操作
  16. pg服务管理 与 psql常用命令
  17. 图像处理函数详解——imadjust
  18. 论文阅读:FACIAL: Synthesizing Dynamic Talking Face with Implicit Attribute Learning
  19. 【每天一个 Linux 命令】网络相关命令(ifconfig、route、ping、traceroute、netstat、ss、telnet、rcp、scp)
  20. 【牛客网】树根与星际密码

热门文章

  1. FileInputFormat接口实现类
  2. 关于生成订单号规则的一些思考
  3. idea无法创建java文件
  4. Yolov5训练自己的数据集(详细完整版)
  5. 电脑不用,电脑不用时需要关机吗
  6. 【STM32+cubemx】0007 HAL库开发:外部中断,优先级和中断向量表
  7. 查询出的数据显示的HTML标签上
  8. 如何改变字体大小呢?
  9. Neutron学习笔记2-- Neutron的网络实现模型
  10. 微软终于对 JDK 下手了…