一般网站上都会消息提醒通知,如一个用户给另一个用户发了一条站内信,那么就会在网站顶部的导航栏上就会有一个消息提醒的数字来提示您有新消息。
上面只是一个简单例子,在实际项目中可能就会有多种类型的提醒,如某个用户给你留言了,就显示提醒“新留言x条”或者“新回复y条”等等吧。
我打算设计成把所有类型的消息提醒统一的放到一张表(notice)里,并标记用户是否已处理了这条消息提醒,在网站的前台就可以只统计这一张表就行了,比如用户A给用户B发送了一条私信,就在notice表里插入一条新的未读消息提醒,用来提醒用户,当用户B查看完成私信后,再回到这张notice表标记为已处理或者直接删除。
但是大数据量或高并发的时候就会存在一个问题,当用户已经查看完了新收到的私信后,去notice表做标记处理时,可能由于种种原因其对应的“未读消息提醒”还没有写进去,这时候就出问题了,当用户去请求是否有“未读消息提醒”时,刚好又写进去了,然后就提示用户有“新消息”,但是实际上用户早已处理掉了,只不过就是“未读消息提醒”延时了。
如果说统计新消息提醒,去各个业务(如私信,留言)中单独统计,然后合并,再通知给用户,这样做的话,怎么称得上是“消息通知系统”呢?总觉得这样是不合理的
对于消息通知系统,我的notice表是否有存在的意义呢,大家是怎么设计的?
回复内容:
一般网站上都会消息提醒通知,如一个用户给另一个用户发了一条站内信,那么就会在网站顶部的导航栏上就会有一个消息提醒的数字来提示您有新消息。
上面只是一个简单例子,在实际项目中可能就会有多种类型的提醒,如某个用户给你留言了,就显示提醒“新留言x条”或者“新回复y条”等等吧。
我打算设计成把所有类型的消息提醒统一的放到一张表(notice)里,并标记用户是否已处理了这条消息提醒,在网站的前台就可以只统计这一张表就行了,比如用户A给用户B发送了一条私信,就在notice表里插入一条新的未读消息提醒,用来提醒用户,当用户B查看完成私信后,再回到这张notice表标记为已处理或者直接删除。
但是大数据量或高并发的时候就会存在一个问题,当用户已经查看完了新收到的私信后,去notice表做标记处理时,可能由于种种原因其对应的“未读消息提醒”还没有写进去,这时候就出问题了,当用户去请求是否有“未读消息提醒”时,刚好又写进去了,然后就提示用户有“新消息”,但是实际上用户早已处理掉了,只不过就是“未读消息提醒”延时了。
如果说统计新消息提醒,去各个业务(如私信,留言)中单独统计,然后合并,再通知给用户,这样做的话,怎么称得上是“消息通知系统”呢?总觉得这样是不合理的
对于消息通知系统,我的notice表是否有存在的意义呢,大家是怎么设计的?
关于消息系统的设计,肯定是需要一个数据表记录通知的,比如Notice表,至于这个通知可能有很多类型,就像你说的 私信和留言,这些在设计中都可以通过字段表示,这里分享下 Worktile 中 Notice的数据结构设计。
{ nid: { type: String, unique: true }, published: { type: Number, default: Date.now }, verb: { type: String }, template: { type: String }, is_read: { type: Number, index: true, default: 0 }, is_pending: { type: Number, index: true, default: 0 }, filter: { ftype: { type: String } }, sender: { type: Actor }, receiver : { type: String , index: true}, data: { entity: { type: Entity }, source: { type: Entity }, target: { type: Entity } } }
具体细节设计可以参考 activity 的一个标准
至于你说的消息高并发的问题其实是没有问题的,你标记完未读消息为已读后在切换页面,这是再读取未读消息前面的标记为已读应该早就处理完了。除非你系统高并发的程度已经达到系统瘫痪了,在没有遇到瓶颈的时候不需要过度优化,即使到达瓶颈也有解决方案的,你可以把所有未读的消息放到内存或者redis中来提高性能。
上面说的是数据结构方面的东西,一般web的消息都是实时更新的,意思就是:你没有刷新页面,此时来消息了,应该立即显示未读消息多少条。关于实时消息系统的做法要取决于你服务端用的什么语言。Node.js+socket.io
就很容易做到,我们的产品Worktile是采用erlang语言实现的
感觉就是系统有了瓶颈,需要一层消息缓存了,直接数据库读写消息效率偏低了,因为数据库在写的时候可读导致数据不一致,消息存在内存中楼上的redis或者memcache中,如果还是会出现写,读不一致的情况,应该横向拓展了吧!
相关文章:

PHP type prompts to improve code quality and readability. 1) Scalar type tips: Since PHP7.0, basic data types are allowed to be specified in function parameters, such as int, float, etc. 2) Return type prompt: Ensure the consistency of the function return value type. 3) Union type prompt: Since PHP8.0, multiple types are allowed to be specified in function parameters or return values. 4) Nullable type prompt: Allows to include null values and handle functions that may return null values.

In PHP, use the clone keyword to create a copy of the object and customize the cloning behavior through the \_\_clone magic method. 1. Use the clone keyword to make a shallow copy, cloning the object's properties but not the object's properties. 2. The \_\_clone method can deeply copy nested objects to avoid shallow copying problems. 3. Pay attention to avoid circular references and performance problems in cloning, and optimize cloning operations to improve efficiency.

PHP is suitable for web development and content management systems, and Python is suitable for data science, machine learning and automation scripts. 1.PHP performs well in building fast and scalable websites and applications and is commonly used in CMS such as WordPress. 2. Python has performed outstandingly in the fields of data science and machine learning, with rich libraries such as NumPy and TensorFlow.

Key players in HTTP cache headers include Cache-Control, ETag, and Last-Modified. 1.Cache-Control is used to control caching policies. Example: Cache-Control:max-age=3600,public. 2. ETag verifies resource changes through unique identifiers, example: ETag: "686897696a7c876b7e". 3.Last-Modified indicates the resource's last modification time, example: Last-Modified:Wed,21Oct201507:28:00GMT.

In PHP, password_hash and password_verify functions should be used to implement secure password hashing, and MD5 or SHA1 should not be used. 1) password_hash generates a hash containing salt values to enhance security. 2) Password_verify verify password and ensure security by comparing hash values. 3) MD5 and SHA1 are vulnerable and lack salt values, and are not suitable for modern password security.

PHP is a server-side scripting language used for dynamic web development and server-side applications. 1.PHP is an interpreted language that does not require compilation and is suitable for rapid development. 2. PHP code is embedded in HTML, making it easy to develop web pages. 3. PHP processes server-side logic, generates HTML output, and supports user interaction and data processing. 4. PHP can interact with the database, process form submission, and execute server-side tasks.

PHP has shaped the network over the past few decades and will continue to play an important role in web development. 1) PHP originated in 1994 and has become the first choice for developers due to its ease of use and seamless integration with MySQL. 2) Its core functions include generating dynamic content and integrating with the database, allowing the website to be updated in real time and displayed in personalized manner. 3) The wide application and ecosystem of PHP have driven its long-term impact, but it also faces version updates and security challenges. 4) Performance improvements in recent years, such as the release of PHP7, enable it to compete with modern languages. 5) In the future, PHP needs to deal with new challenges such as containerization and microservices, but its flexibility and active community make it adaptable.

The core benefits of PHP include ease of learning, strong web development support, rich libraries and frameworks, high performance and scalability, cross-platform compatibility, and cost-effectiveness. 1) Easy to learn and use, suitable for beginners; 2) Good integration with web servers and supports multiple databases; 3) Have powerful frameworks such as Laravel; 4) High performance can be achieved through optimization; 5) Support multiple operating systems; 6) Open source to reduce development costs.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function

WebStorm Mac version
Useful JavaScript development tools

Safe Exam Browser
Safe Exam Browser is a secure browser environment for taking online exams securely. This software turns any computer into a secure workstation. It controls access to any utility and prevents students from using unauthorized resources.

SublimeText3 English version
Recommended: Win version, supports code prompts!

Zend Studio 13.0.1
Powerful PHP integrated development environment